Author: Dmitriy Chestnykh Date: 2024-07-08T13:09:42-04:00 New Revision: 09a275e8a4c2cea22bb67c7247fc892d5e73eb42
URL: https://github.com/llvm/llvm-project/commit/09a275e8a4c2cea22bb67c7247fc892d5e73eb42 DIFF: https://github.com/llvm/llvm-project/commit/09a275e8a4c2cea22bb67c7247fc892d5e73eb42.diff LOG: [clang] Use internal linkage for c23 constexpr vars. (#97846) See C23 std 6.2.2p3. Fixes #97830 Added: clang/test/CodeGen/constexpr-c23-internal-linkage.c Modified: clang/lib/AST/Decl.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 16ed6d88d1cb1..490c4a2fc525c 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -612,19 +612,26 @@ LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D, assert(D->getDeclContext()->getRedeclContext()->isFileContext() && "Not a name having namespace scope"); ASTContext &Context = D->getASTContext(); + const auto *Var = dyn_cast<VarDecl>(D); // C++ [basic.link]p3: // A name having namespace scope (3.3.6) has internal linkage if it // is the name of - if (getStorageClass(D->getCanonicalDecl()) == SC_Static) { + if ((getStorageClass(D->getCanonicalDecl()) == SC_Static) || + (Context.getLangOpts().C23 && Var && Var->isConstexpr())) { // - a variable, variable template, function, or function template // that is explicitly declared static; or // (This bullet corresponds to C99 6.2.2p3.) + + // C23 6.2.2p3 + // If the declaration of a file scope identifier for + // an object contains any of the storage-class specifiers static or + // constexpr then the identifier has internal linkage. return LinkageInfo::internal(); } - if (const auto *Var = dyn_cast<VarDecl>(D)) { + if (Var) { // - a non-template variable of non-volatile const-qualified type, unless // - it is explicitly declared extern, or // - it is declared in the purview of a module interface unit diff --git a/clang/test/CodeGen/constexpr-c23-internal-linkage.c b/clang/test/CodeGen/constexpr-c23-internal-linkage.c new file mode 100644 index 0000000000000..1236062272a2d --- /dev/null +++ b/clang/test/CodeGen/constexpr-c23-internal-linkage.c @@ -0,0 +1,18 @@ +/* + * RUN: %clang_cc1 -std=c23 -emit-llvm -o - %s | FileCheck %s + */ + +constexpr int var_int = 1; +constexpr char var_char = 'a'; +constexpr float var_float = 2.5; + +const int *p_i = &var_int; +const char *p_c = &var_char; +const float *p_f = &var_float; + +/* +CHECK: @var_int = internal constant i32 1{{.*}} +CHECK: @var_char = internal constant i8 97{{.*}} +CHECK: @var_float = internal constant float 2.5{{.*}} +*/ + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits