]> granicus.if.org Git - clang/commitdiff
Test what happens when tag lookup and redeclaration lookup disagree
authorReid Kleckner <rnk@google.com>
Tue, 4 Oct 2016 18:10:23 +0000 (18:10 +0000)
committerReid Kleckner <rnk@google.com>
Tue, 4 Oct 2016 18:10:23 +0000 (18:10 +0000)
Clang has a diagnostic for the what happens when an elaborated type
implicitly creates a tag declaration and the initial tag lookup fails,
but the redeclaration lookup succeeds and finds a non-tag type. However,
it wasn't tested, and looked like dead code. After much staring, we
discovered how to exercise it, and are now committing the test for
posterity.

In this example, the tag lookup will not find A, but then when we go to
insert a declaration of A at global scope, we discover the template
friend, which is not a tag type.

  struct C {
    template <typename> friend struct A;
  };
  struct B {
    struct A *p;
  };

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

test/SemaCXX/elaborated-type-specifier.cpp

index 81c5cb4eac59bd4da3c1b7acb66c5d1d5e9e2bd9..3701dd7ba630a796905ebb7cfbc440a4c3a284a0 100644 (file)
@@ -52,3 +52,12 @@ namespace test5 {
     }
   };
 }
+
+namespace test6 {
+struct C {
+  template <typename> friend struct A; // expected-note {{'A' declared here}}
+};
+struct B {
+  struct A *p; // expected-error {{implicit declaration introduced by elaborated type conflicts with a template of the same name}}
+};
+}