diff options
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/extern-c.cpp | 38 | ||||
-rw-r--r-- | clang/test/SemaCXX/friend.cpp | 14 |
3 files changed, 54 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 9c442a61ce2..81460418ca4 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -12338,7 +12338,8 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, LookupResult::Filter F = Previous.makeFilter(); while (F.hasNext()) { NamedDecl *ND = F.next(); - if (ND->getDeclContext()->getRedeclContext() != SearchDC) + if (!ND->getDeclContext()->getRedeclContext()->Equals( + SearchDC->getRedeclContext())) F.erase(); } F.done(); diff --git a/clang/test/SemaCXX/extern-c.cpp b/clang/test/SemaCXX/extern-c.cpp index 295d1f305ee..fa6c2b1990c 100644 --- a/clang/test/SemaCXX/extern-c.cpp +++ b/clang/test/SemaCXX/extern-c.cpp @@ -204,3 +204,41 @@ extern "C" { struct pr5065_n6 : public virtual pr5065_3 {}; } struct pr5065_n7 {}; + +namespace tag_hiding { + namespace namespace_with_injected_name { + class Boo { + friend struct ExternCStruct1; + }; + void ExternCStruct4(); // expected-note 2{{candidate}} + } + + class Baz { + friend struct ExternCStruct2; + friend void ExternCStruct3(); + }; + + using namespace namespace_with_injected_name; + + extern "C" { + struct ExternCStruct1; + struct ExternCStruct2; + struct ExternCStruct3; + struct ExternCStruct4; // expected-note {{candidate}} + } + ExternCStruct1 *p1; + ExternCStruct2 *p2; + ExternCStruct3 *p3; + ExternCStruct4 *p4; // expected-error {{ambiguous}} + + extern "C" { + struct ExternCStruct1; + struct ExternCStruct2; + struct ExternCStruct3; + struct ExternCStruct4; // expected-note {{candidate}} + } + ExternCStruct1 *q1 = p1; + ExternCStruct2 *q2 = p2; + ExternCStruct3 *q3 = p3; + ExternCStruct4 *q4 = p4; // expected-error {{ambiguous}} +} diff --git a/clang/test/SemaCXX/friend.cpp b/clang/test/SemaCXX/friend.cpp index a8e20439419..c90ce74616d 100644 --- a/clang/test/SemaCXX/friend.cpp +++ b/clang/test/SemaCXX/friend.cpp @@ -363,3 +363,17 @@ void g_pr6954() { f_pr6954(5); // expected-error{{undeclared identifier 'f_pr6954'}} } +namespace tag_redecl { + namespace N { + struct X *p; + namespace { + class K { + friend struct X; + }; + } + } + namespace N { + struct X; + X *q = p; + } +} |