]> granicus.if.org Git - clang/commitdiff
Delay attribute checking until auto types are deduced
authorNico Rieck <nico.rieck@gmail.com>
Tue, 21 Jan 2014 23:54:36 +0000 (23:54 +0000)
committerNico Rieck <nico.rieck@gmail.com>
Tue, 21 Jan 2014 23:54:36 +0000 (23:54 +0000)
Checking in ActOnVariableDeclarator computes and caches the linkage using
the non-deduced auto type which defaults to external linkage. Depending on
how the auto type is deduced linkage can change and conflict with the
cached linkage, hitting asserts.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199774 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/attr-selectany.cpp
test/SemaCXX/attr-weak.cpp
test/SemaCXX/attr-weakref.cpp

index f7b7ac87ec983bf6a9e9c7c8326fe98116907815..c08d87d59a89f6ff105e0e62e61ae6cddb36d37c 100644 (file)
@@ -4816,6 +4816,10 @@ bool Sema::inferObjCARCLifetime(ValueDecl *decl) {
 }
 
 static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) {
+  // Ensure that an auto decl is deduced otherwise the checks below might cache
+  // the wrong linkage.
+  assert(S.ParsingInitForAutoVars.count(&ND) == 0);
+
   // 'weak' only applies to declarations with external linkage.
   if (WeakAttr *Attr = ND.getAttr<WeakAttr>()) {
     if (!ND.isExternallyVisible()) {
@@ -5431,7 +5435,6 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
   }
 
   ProcessPragmaWeak(S, NewVD);
-  checkAttributesAfterMerging(*this, *NewVD);
 
   // If this is the first declaration of an extern C variable, update
   // the map of such variables.
@@ -8892,6 +8895,8 @@ Sema::FinalizeDeclaration(Decl *ThisDecl) {
   if (!VD)
     return;
 
+  checkAttributesAfterMerging(*this, *VD);
+
   if (UsedAttr *Attr = VD->getAttr<UsedAttr>()) {
     if (!Attr->isInherited() && !VD->isThisDeclarationADefinition()) {
       Diag(Attr->getLocation(), diag::warn_attribute_ignored) << Attr;
index 0f9776dbf5db0f03a347dca6a579023b5fc9843c..c27a9159215ffc4fe6348477968fe700cd106f87 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify -std=c++11 %s
 // MSVC produces similar diagnostics.
 
 __declspec(selectany) void foo() { } // expected-error{{'selectany' can only be applied to data items with external linkage}}
@@ -31,3 +31,6 @@ class X {
 };
 
 __declspec(selectany) X x(1);
+
+namespace { class Internal {}; }
+__declspec(selectany) auto x8 = Internal(); // expected-error {{'selectany' can only be applied to data items with external linkage}}
index 2000e7fc683b3ba6232b980b780b06bfdda43342..8ba3a954282d2513c75b89bcfa8d2e43a1c366c9 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify -std=c++11 %s
 
 static int test0 __attribute__((weak)); // expected-error {{weak declaration cannot have internal linkage}}
 static void test1() __attribute__((weak)); // expected-error {{weak declaration cannot have internal linkage}}
@@ -31,8 +31,10 @@ template <class T> struct Test7 {
 };
 template <class T>
 int Test7<T>::var;
-namespace { class Internal; }
+namespace { class Internal {}; }
 template struct Test7<Internal>;
 template struct Test7<int>;
 
 class __attribute__((weak)) Test8 {}; // OK
+
+__attribute__((weak)) auto Test9 = Internal(); // expected-error {{weak declaration cannot have internal linkage}}
index 0c3f1d20e7f79b0e7cc3a88e420ad700c25b6c03..46ca5ab20682037e1952f39665a314a4420a1c84 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify -std=c++11 %s
 
 // GCC will accept anything as the argument of weakref. Should we
 // check for an existing decl?
@@ -34,3 +34,5 @@ static int a10();
 int a10() __attribute__((weakref ("foo")));
 
 static int v __attribute__((weakref(a1), alias("foo"))); // expected-error {{'weakref' attribute requires a string}}
+
+__attribute__((weakref ("foo"))) auto a11 = 1; // expected-error {{weakref declaration must have internal linkage}}