From 7a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94c Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 15 Oct 2013 23:19:58 +0000 Subject: [PATCH] Test that we can merge together explicit and partial specializations from merged declarations of a class template. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192746 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Modules/Inputs/cxx-templates-a.h | 8 ++++++++ test/Modules/Inputs/cxx-templates-b.h | 8 ++++++++ test/Modules/Inputs/cxx-templates-c.h | 7 +++++++ test/Modules/Inputs/module.map | 4 ++++ test/Modules/cxx-templates.cpp | 8 ++++++++ 5 files changed, 35 insertions(+) create mode 100644 test/Modules/Inputs/cxx-templates-c.h diff --git a/test/Modules/Inputs/cxx-templates-a.h b/test/Modules/Inputs/cxx-templates-a.h index 0ca6e34d0b..0b1614d3d9 100644 --- a/test/Modules/Inputs/cxx-templates-a.h +++ b/test/Modules/Inputs/cxx-templates-a.h @@ -40,3 +40,11 @@ const auto enum_c_from_a = CommonTemplate::c; template struct UseInt; template void UseRedeclaredEnum(UseInt::a>); constexpr void (*UseRedeclaredEnumA)(UseInt<1>) = UseRedeclaredEnum; + +template struct MergeSpecializations; +template struct MergeSpecializations { + typedef int partially_specialized_in_a; +}; +template<> struct MergeSpecializations { + typedef int explicitly_specialized_in_a; +}; diff --git a/test/Modules/Inputs/cxx-templates-b.h b/test/Modules/Inputs/cxx-templates-b.h index f0921a7e0b..6cd83faf1a 100644 --- a/test/Modules/Inputs/cxx-templates-b.h +++ b/test/Modules/Inputs/cxx-templates-b.h @@ -51,6 +51,14 @@ template struct UseInt; template void UseRedeclaredEnum(UseInt::a>); constexpr void (*UseRedeclaredEnumB)(UseInt<1>) = UseRedeclaredEnum; +template struct MergeSpecializations; +template struct MergeSpecializations { + typedef int partially_specialized_in_b; +}; +template<> struct MergeSpecializations { + typedef int explicitly_specialized_in_b; +}; + @import cxx_templates_a; template void UseDefinedInBImplIndirectly(T &v) { PerformDelayedLookup(v); diff --git a/test/Modules/Inputs/cxx-templates-c.h b/test/Modules/Inputs/cxx-templates-c.h new file mode 100644 index 0000000000..4c0fc8a4a8 --- /dev/null +++ b/test/Modules/Inputs/cxx-templates-c.h @@ -0,0 +1,7 @@ +template struct MergeSpecializations; +template struct MergeSpecializations { + typedef int partially_specialized_in_c; +}; +template<> struct MergeSpecializations { + typedef int explicitly_specialized_in_c; +}; diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index ac3543b644..7534eb253d 100644 --- a/test/Modules/Inputs/module.map +++ b/test/Modules/Inputs/module.map @@ -204,6 +204,10 @@ module cxx_templates_b { header "cxx-templates-b.h" } +module cxx_templates_c { + header "cxx-templates-c.h" +} + module cxx_decls { module unimported { header "cxx-decls-unimported.h" diff --git a/test/Modules/cxx-templates.cpp b/test/Modules/cxx-templates.cpp index 0965aa8b0b..65f41f677b 100644 --- a/test/Modules/cxx-templates.cpp +++ b/test/Modules/cxx-templates.cpp @@ -5,6 +5,7 @@ @import cxx_templates_a; @import cxx_templates_b; +@import cxx_templates_c; @import cxx_templates_common; template struct Tmpl_T_C {}; @@ -93,6 +94,13 @@ RedeclaredAsFriend raf1; RedeclareTemplateAsFriend rtaf; RedeclaredAsFriend raf2; +MergeSpecializations::partially_specialized_in_a spec_in_a_1; +MergeSpecializations::partially_specialized_in_b spec_in_b_1; +MergeSpecializations::partially_specialized_in_c spec_in_c_1; +MergeSpecializations::explicitly_specialized_in_a spec_in_a_2; +MergeSpecializations::explicitly_specialized_in_b spec_in_b_2; +MergeSpecializations::explicitly_specialized_in_c spec_in_c_2; + @import cxx_templates_common; typedef SomeTemplate SomeTemplateIntPtr; -- 2.50.1