diff options
-rw-r--r-- | lib/AST/Decl.cpp | 10 | ||||
-rw-r--r-- | test/CodeGenCXX/const-global-linkage.cpp | 4 |
2 files changed, 9 insertions, 5 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 442deca11b..8e4ba0c5d2 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -213,12 +213,12 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, if (Var->getStorageClass() == SC_Static) return LinkageInfo::internal(); - // - an object or reference that is explicitly declared const - // and neither explicitly declared extern nor previously - // declared to have external linkage; or - // (there is no equivalent in C99) + // - a non-volatile object or reference that is explicitly declared const + // or constexpr and neither explicitly declared extern nor previously + // declared to have external linkage; or (there is no equivalent in C99) if (Context.getLangOpts().CPlusPlus && - Var->getType().isConstant(Context) && + Var->getType().isConstQualified() && + !Var->getType().isVolatileQualified() && Var->getStorageClass() != SC_Extern && Var->getStorageClass() != SC_PrivateExtern) { bool FoundExtern = false; diff --git a/test/CodeGenCXX/const-global-linkage.cpp b/test/CodeGenCXX/const-global-linkage.cpp index d0a055b494..df78fdd028 100644 --- a/test/CodeGenCXX/const-global-linkage.cpp +++ b/test/CodeGenCXX/const-global-linkage.cpp @@ -2,12 +2,16 @@ const int x = 10; const int y = 20; +const volatile int z = 30; // CHECK-NOT: @x +// CHECK: @z = constant i32 30 // CHECK: @_ZL1y = internal constant i32 20 const int& b() { return y; } const char z1[] = "asdf"; const char z2[] = "zxcv"; +const volatile char z3[] = "zxcv"; // CHECK-NOT: @z1 +// CHECK: @z3 = constant // CHECK: @_ZL2z2 = internal constant const char* b2() { return z2; } |