diff --git a/test/SemaCXX/linkage2.cpp b/test/SemaCXX/linkage2.cpp
index 8c80f4bdb9014596222082f3450071773146bc34..6f43af39f7c57cedd3fa932ad40498aff68a5fe7 100644
--- a/test/SemaCXX/linkage2.cpp
+++ b/test/SemaCXX/linkage2.cpp
@@ -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
+}