diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-10-21 21:15:18 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-10-21 21:15:18 +0000 |
| commit | 6377f8f7fb1f0ed32fd80acf733659fb7982011b (patch) | |
| tree | e4942303386487d4d828d6d0249b1cd21b30e56b /clang/test/Modules | |
| parent | a721db24c08bd64dc3495ce1b20bf8dc182e9656 (diff) | |
| download | bcm5719-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.h | 5 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/cxx-templates-b.h | 5 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/cxx-templates-c.h | 5 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/cxx-templates-d.h | 6 | ||||
| -rw-r--r-- | clang/test/Modules/cxx-templates.cpp | 4 |
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, ""); |

