diff options
author | Ismail Pazarbasi <ismail.pazarbasi@gmail.com> | 2014-03-06 21:48:45 +0000 |
---|---|---|
committer | Ismail Pazarbasi <ismail.pazarbasi@gmail.com> | 2014-03-06 21:48:45 +0000 |
commit | be19ae05e7dedc052d3b8314e74d6810f1ec7197 (patch) | |
tree | 6604563c9074576b71a5763adccd73ad1bce41ce | |
parent | 02548c08f85393fac483fa66565d07ef38da9b01 (diff) | |
download | bcm5719-llvm-be19ae05e7dedc052d3b8314e74d6810f1ec7197.tar.gz bcm5719-llvm-be19ae05e7dedc052d3b8314e74d6810f1ec7197.zip |
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.
llvm-svn: 203168
-rw-r--r-- | clang/lib/AST/Decl.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaCXX/linkage2.cpp | 4 |
2 files changed, 6 insertions, 3 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index e362c730d40..db404ec5fe3 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/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<NamedDecl>(*I); if (T == D) continue; - if (T->hasCachedLinkage()) { + if (!T->isInvalidDecl() && T->hasCachedLinkage()) { Old = T; break; } diff --git a/clang/test/SemaCXX/linkage2.cpp b/clang/test/SemaCXX/linkage2.cpp index 075f5e70c24..a7eb15f7c6b 100644 --- a/clang/test/SemaCXX/linkage2.cpp +++ b/clang/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 +} |