Index: clang-tidy/cert/StaticObjectExceptionCheck.cpp =================================================================== --- clang-tidy/cert/StaticObjectExceptionCheck.cpp +++ clang-tidy/cert/StaticObjectExceptionCheck.cpp @@ -26,9 +26,9 @@ // with a constructor that can throw. Finder->addMatcher( varDecl(anyOf(hasThreadStorageDuration(), hasStaticStorageDuration()), + unless(hasAncestor(functionDecl())), hasInitializer(cxxConstructExpr(hasDeclaration( - cxxConstructorDecl(unless(isNoThrow())) - .bind("ctor"))))) + cxxConstructorDecl(unless(isNoThrow())).bind("ctor"))))) .bind("var"), this); } Index: test/clang-tidy/cert-static-object-exception.cpp =================================================================== --- test/clang-tidy/cert-static-object-exception.cpp +++ test/clang-tidy/cert-static-object-exception.cpp @@ -28,25 +28,89 @@ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: construction of 'v' with static storage duration may throw an exception that cannot be caught // CHECK-MESSAGES: 16:12: note: possibly throwing constructor declared here +thread_local S s3; +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: construction of 's3' with thread_local storage duration may throw an exception that cannot be caught +thread_local T t3; // ok +thread_local U u3; +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: construction of 'u3' with thread_local storage duration may throw an exception that cannot be caught +thread_local V v3("v"); +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: construction of 'v3' with thread_local storage duration may throw an exception that cannot be caught + void f(S s1, T t1, U u1, V v1) { // ok, ok, ok, ok S s2; // ok T t2; // ok U u2; // ok V v2("v"); // ok - thread_local S s3; - // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: construction of 's3' with thread_local storage duration may throw an exception that cannot be caught + thread_local S s3; // ok thread_local T t3; // ok - thread_local U u3; - // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: construction of 'u3' with thread_local storage duration may throw an exception that cannot be caught - thread_local V v3("v"); - // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: construction of 'v3' with thread_local storage duration may throw an exception that cannot be caught + thread_local U u3; // ok + thread_local V v3("v"); // ok - static S s4; - // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 's4' with static storage duration may throw an exception that cannot be caught + static S s4; // ok static T t4; // ok - static U u4; - // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 'u4' with static storage duration may throw an exception that cannot be caught - static V v4("v"); - // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 'v4' with static storage duration may throw an exception that cannot be caught + static U u4; // ok + static V v4("v"); // ok } + +namespace { +S s; +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: construction of 's' with static storage duration may throw an exception that cannot be caught [cert-err58-cpp] +// CHECK-MESSAGES: 4:3: note: possibly throwing constructor declared here +T t; // ok +U u; +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: construction of 'u' with static storage duration may throw an exception that cannot be caught +// CHECK-MESSAGES: 12:3: note: possibly throwing constructor declared here +V v("v"); +// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: construction of 'v' with static storage duration may throw an exception that cannot be caught +// CHECK-MESSAGES: 16:12: note: possibly throwing constructor declared here + +thread_local S s3; +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: construction of 's3' with thread_local storage duration may throw an exception that cannot be caught +thread_local T t3; // ok +thread_local U u3; +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: construction of 'u3' with thread_local storage duration may throw an exception that cannot be caught +thread_local V v3("v"); +// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: construction of 'v3' with thread_local storage duration may throw an exception that cannot be caught +}; + +class Statics { + static S s; + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 's' with static storage duration may throw an exception that cannot be caught [cert-err58-cpp] + // CHECK-MESSAGES: 4:3: note: possibly throwing constructor declared here + static T t; // ok + static U u; + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 'u' with static storage duration may throw an exception that cannot be caught + // CHECK-MESSAGES: 12:3: note: possibly throwing constructor declared here + static V v; + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 'v' with static storage duration may throw an exception that cannot be caught + // CHECK-MESSAGES: 16:12: note: possibly throwing constructor declared here + + void f(S s, T t, U u, V v) { + S s2; // ok + T t2; // ok + U u2; // ok + V v2("v"); // ok + + thread_local S s3; // ok + thread_local T t3; // ok + thread_local U u3; // ok + thread_local V v3("v"); // ok + + static S s4; // ok + static T t4; // ok + static U u4; // ok + static V v4("v"); // ok + } +}; + +S Statics::s; +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 's' with static storage duration may throw an exception that cannot be caught [cert-err58-cpp] +// CHECK-MESSAGES: 4:3: note: possibly throwing constructor declared here +T Statics::t; +U Statics::u; +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 'u' with static storage duration may throw an exception that cannot be caught +// CHECK-MESSAGES: 12:3: note: possibly throwing constructor declared here +V Statics::v("v"); +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: construction of 'v' with static storage duration may throw an exception that cannot be caught +// CHECK-MESSAGES: 16:12: note: possibly throwing constructor declared here