From: Ismail Pazarbasi Date: Thu, 6 Mar 2014 21:48:45 +0000 (+0000) Subject: Exclude invalid old decl from mismatching linkage assertion X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5b7cea35373b4ba97f9e4b0efe23d7802258bd76;p=clang Exclude invalid old decl from mismatching linkage assertion This patch fixes PR18964. In linkage computation, assertion fails when an old invalid declaration's linkage mismatches with the current decl's one. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203168 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index e362c730d4..db404ec5fe 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1243,8 +1243,7 @@ public: // We have just computed the linkage for this decl. By induction we know // that all other computed linkages match, check that the one we just - // computed - // also does. + // computed also does. NamedDecl *Old = NULL; for (NamedDecl::redecl_iterator I = D->redecls_begin(), E = D->redecls_end(); @@ -1252,7 +1251,7 @@ public: NamedDecl *T = cast(*I); if (T == D) continue; - if (T->hasCachedLinkage()) { + if (!T->isInvalidDecl() && T->hasCachedLinkage()) { Old = T; break; } diff --git a/test/SemaCXX/linkage2.cpp b/test/SemaCXX/linkage2.cpp index 075f5e70c2..a7eb15f7c6 100644 --- a/test/SemaCXX/linkage2.cpp +++ b/test/SemaCXX/linkage2.cpp @@ -213,3 +213,7 @@ namespace PR16247 { void pr16247_bar(int) {} void pr16247_bar(double) {} } +namespace PR18964 { + unsigned &*foo; //expected-error{{'foo' declared as a pointer to a reference of type}} + extern struct {} *foo; // don't assert +}