aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-10-19 06:37:48 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-10-19 06:37:48 +0000
commit820e9a7e29a01bd4a91537a6c6d4524834da622b (patch)
treec6ad71b6029ad344ff61c1a734cc789dd9bee457
parent80ddc31c5379df78a007eaf08d531efdbcd9b161 (diff)
DR1511: A const volatile global does not implicitly get internal linkage like a
const non-volatile global does. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166269 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/Decl.cpp10
-rw-r--r--test/CodeGenCXX/const-global-linkage.cpp4
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; }