]> granicus.if.org Git - clang/commitdiff
Add test for regression caused by reverted patch r315251.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 10 Oct 2017 21:07:44 +0000 (21:07 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 10 Oct 2017 21:07:44 +0000 (21:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@315366 91177308-0d34-0410-b5e6-96231b3b80d8

test/SemaCXX/linkage2.cpp

index 8c80f4bdb9014596222082f3450071773146bc34..6f43af39f7c57cedd3fa932ad40498aff68a5fe7 100644 (file)
@@ -218,3 +218,34 @@ namespace PR18964 {
   unsigned &*foo; //expected-error{{'foo' declared as a pointer to a reference of type}}
   extern struct {} *foo; // don't assert
 }
+
+namespace typedef_name_for_linkage {
+  template<typename T> struct Use {};
+
+  struct A { A(); A(const A&); ~A(); };
+
+  typedef struct {
+    A a;
+  } B;
+
+  struct C {
+    typedef struct {
+      A a;
+    } D;
+  };
+
+  typedef struct {
+    void f() { static int n; struct Inner {};}
+  } E;
+
+  // FIXME: Ideally this would be accepted in all modes. In C++98, we trigger a
+  // linkage calculation to drive the "internal linkage type as template
+  // argument" warning.
+  typedef struct {
+    void f() { struct Inner {}; Use<Inner> ui; }
+  } F;
+#if __cplusplus < 201103L
+  // expected-error@-2 {{unsupported: typedef changes linkage of anonymous type, but linkage was already computed}}
+  // expected-note@-5 {{use a tag name here}}
+#endif
+}