summaryrefslogtreecommitdiffstats
path: root/clang/test/Modules
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-10-21 21:15:18 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-10-21 21:15:18 +0000
commit6377f8f7fb1f0ed32fd80acf733659fb7982011b (patch)
treee4942303386487d4d828d6d0249b1cd21b30e56b /clang/test/Modules
parenta721db24c08bd64dc3495ce1b20bf8dc182e9656 (diff)
downloadbcm5719-llvm-6377f8f7fb1f0ed32fd80acf733659fb7982011b.tar.gz
bcm5719-llvm-6377f8f7fb1f0ed32fd80acf733659fb7982011b.zip
[modules] When building an injected-class-name type, we may have to insert it
into multiple merged classes' TypeForDecl slots. llvm-svn: 220331
Diffstat (limited to 'clang/test/Modules')
-rw-r--r--clang/test/Modules/Inputs/cxx-templates-a.h5
-rw-r--r--clang/test/Modules/Inputs/cxx-templates-b.h5
-rw-r--r--clang/test/Modules/Inputs/cxx-templates-c.h5
-rw-r--r--clang/test/Modules/Inputs/cxx-templates-d.h6
-rw-r--r--clang/test/Modules/cxx-templates.cpp4
5 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/Modules/Inputs/cxx-templates-a.h b/clang/test/Modules/Inputs/cxx-templates-a.h
index 135fbb7702f..4340910d1e2 100644
--- a/clang/test/Modules/Inputs/cxx-templates-a.h
+++ b/clang/test/Modules/Inputs/cxx-templates-a.h
@@ -99,3 +99,8 @@ struct MergeAnonUnionMember {
inline MergeAnonUnionMember<> maum_a() { return {}; }
template<typename T> struct DontWalkPreviousDeclAfterMerging { struct Inner { typedef T type; }; };
+
+namespace TestInjectedClassName {
+ template<typename T> struct X { X(); };
+ typedef X<char[1]> A;
+}
diff --git a/clang/test/Modules/Inputs/cxx-templates-b.h b/clang/test/Modules/Inputs/cxx-templates-b.h
index 1fd6fd42316..d763c8040ba 100644
--- a/clang/test/Modules/Inputs/cxx-templates-b.h
+++ b/clang/test/Modules/Inputs/cxx-templates-b.h
@@ -24,6 +24,11 @@ template<typename T> template<typename U>
constexpr int Outer<T>::Inner<U>::g() { return 2; }
static_assert(Outer<int>::Inner<int>::g() == 2, "");
+namespace TestInjectedClassName {
+ template<typename T> struct X { X(); };
+ typedef X<char[2]> B;
+}
+
@import cxx_templates_b_impl;
template<typename T, typename> struct Identity { typedef T type; };
diff --git a/clang/test/Modules/Inputs/cxx-templates-c.h b/clang/test/Modules/Inputs/cxx-templates-c.h
index 269db441d58..e5395b6c7ed 100644
--- a/clang/test/Modules/Inputs/cxx-templates-c.h
+++ b/clang/test/Modules/Inputs/cxx-templates-c.h
@@ -21,3 +21,8 @@ inline MergeAnonUnionMember<> maum_c() { return {}; }
template<typename T> struct DontWalkPreviousDeclAfterMerging { struct Inner { typedef T type; }; };
typedef DontWalkPreviousDeclAfterMerging<char>::Inner dwpdam_typedef;
+
+namespace TestInjectedClassName {
+ template<typename T> struct X { X(); };
+ typedef X<char[3]> C;
+}
diff --git a/clang/test/Modules/Inputs/cxx-templates-d.h b/clang/test/Modules/Inputs/cxx-templates-d.h
index 6aefdeca64d..1fb1a2282b9 100644
--- a/clang/test/Modules/Inputs/cxx-templates-d.h
+++ b/clang/test/Modules/Inputs/cxx-templates-d.h
@@ -1,3 +1,9 @@
@import cxx_templates_common;
inline int InstantiateWithAnonymousDeclsD(WithAnonymousDecls<char> x) { return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e; }
+
+namespace TestInjectedClassName {
+ template<typename T> struct X { X(); };
+ typedef X<int> D;
+ inline D UseD() { return D(); }
+}
diff --git a/clang/test/Modules/cxx-templates.cpp b/clang/test/Modules/cxx-templates.cpp
index 13e209acc40..d9c8a8c27d0 100644
--- a/clang/test/Modules/cxx-templates.cpp
+++ b/clang/test/Modules/cxx-templates.cpp
@@ -122,6 +122,10 @@ void g() {
(void)&WithImplicitSpecialMembers<int>::n;
MergeClassTemplateSpecializations_string s;
+
+ extern TestInjectedClassName::A *use_a;
+ extern TestInjectedClassName::C *use_c;
+ TestInjectedClassName::UseD();
}
static_assert(Outer<int>::Inner<int>::f() == 1, "");
OpenPOWER on IntegriCloud