Author: Joseph Huber Date: 2025-03-06T20:43:42-06:00 New Revision: d5cef39d7411b3c48e5c2160f1e4711edc24dcd3
URL: https://github.com/llvm/llvm-project/commit/d5cef39d7411b3c48e5c2160f1e4711edc24dcd3 DIFF: https://github.com/llvm/llvm-project/commit/d5cef39d7411b3c48e5c2160f1e4711edc24dcd3.diff LOG: [Clang] Make '-Wglobal-constructors` work on the GNU attributes (#129917) Summary: The `-Wglobal-constructors` option is useful for restricting the usage of global constructors / destructors. However, it currently ignores the attributes that introduce global constructors, meaning that the module can still have ctors if `-Werror` is set. If this is intentional by the user, I believe it would be more correct to push the diagnostic. Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDeclAttr.cpp clang/test/SemaCXX/attr-require-constant-initialization.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e1a8dad87ad29..e42541818a0e9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -62,6 +62,9 @@ AST Dumping Potentially Breaking Changes Clang Frontend Potentially Breaking Changes ------------------------------------------- +- The ``-Wglobal-constructors`` flag now applies to ``[[gnu::constructor]]`` and + ``[[gnu::destructor]]`` attributes. + Clang Python Bindings Potentially Breaking Changes -------------------------------------------------- diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 1405ee5341dcf..c1e97aa2dde5b 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -2138,6 +2138,8 @@ static void handleConstructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) { if (AL.getNumArgs() && !S.checkUInt32Argument(AL, AL.getArgAsExpr(0), priority)) return; + S.Diag(D->getLocation(), diag::warn_global_constructor) + << D->getSourceRange(); D->addAttr(::new (S.Context) ConstructorAttr(S.Context, AL, priority)); } @@ -2147,6 +2149,7 @@ static void handleDestructorAttr(Sema &S, Decl *D, const ParsedAttr &AL) { if (AL.getNumArgs() && !S.checkUInt32Argument(AL, AL.getArgAsExpr(0), priority)) return; + S.Diag(D->getLocation(), diag::warn_global_destructor) << D->getSourceRange(); D->addAttr(::new (S.Context) DestructorAttr(S.Context, AL, priority)); } diff --git a/clang/test/SemaCXX/attr-require-constant-initialization.cpp b/clang/test/SemaCXX/attr-require-constant-initialization.cpp index 4c0a834551715..b1736ea7a3ebe 100644 --- a/clang/test/SemaCXX/attr-require-constant-initialization.cpp +++ b/clang/test/SemaCXX/attr-require-constant-initialization.cpp @@ -337,6 +337,11 @@ constexpr TestCtor<NotC> inval_constexpr(42); // expected-error {{must be initia ATTR constexpr TestCtor<NotC> inval_constexpr2(42); // expected-error {{must be initialized by a constant expression}} // expected-note@-1 {{in call to 'TestCtor(42)'}} +[[gnu::constructor]] void ctor() {} +// expected-warning@-1 {{declaration requires a global constructor}} +[[gnu::destructor]] void dtor() {} +// expected-warning@-1 {{declaration requires a global destructor}} + #elif defined(TEST_THREE) #if defined(__cplusplus) #error This test requires C _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits