Author: Chuanqi Xu Date: 2022-01-28T15:32:28+08:00 New Revision: 61528a77780e696a657b1a55de6bb48db7026245
URL: https://github.com/llvm/llvm-project/commit/61528a77780e696a657b1a55de6bb48db7026245 DIFF: https://github.com/llvm/llvm-project/commit/61528a77780e696a657b1a55de6bb48db7026245.diff LOG: [NFC] Add tests for ODR checking of default template argument Added: Modified: clang/test/Modules/odr_hash.cpp Removed: ################################################################################ diff --git a/clang/test/Modules/odr_hash.cpp b/clang/test/Modules/odr_hash.cpp index e2ff4348f04bb..fe51915074239 100644 --- a/clang/test/Modules/odr_hash.cpp +++ b/clang/test/Modules/odr_hash.cpp @@ -2398,6 +2398,93 @@ using TemplateParameters::S6; // expected-note@first.h:* {{but in 'FirstModule' found template parameter 'A'}} #endif +#if defined(FIRST) +template <int A = 7> +struct S7 {}; +#elif defined(SECOND) +template <int A = 8> +struct S7 {}; +#else +using TemplateParameters::S7; +// expected-error@second.h:* {{'TemplateParameters::S7' has diff erent definitions in diff erent modules; first diff erence is definition in module 'SecondModule' found template parameter with default argument}} +// expected-note@first.h:* {{but in 'FirstModule' found template parameter with diff erent default argument}} +#endif + +#if defined(FIRST) +template <int* A = nullptr> +struct S8 {}; +#elif defined(SECOND) +inline int S8_default_arg = 0x12345; +template <int* A = &S8_default_arg> +struct S8 {}; +#else +using TemplateParameters::S8; +// expected-error@second.h:* {{'TemplateParameters::S8' has diff erent definitions in diff erent modules; first diff erence is definition in module 'SecondModule' found template parameter with default argument}} +// expected-note@first.h:* {{but in 'FirstModule' found template parameter with diff erent default argument}} +#endif + +#if defined(FIRST) +template <int A = 43> +struct S9 {}; +#elif defined(SECOND) +template <int A = 43> +struct S9 {}; +#else +using TemplateParameters::S9; +#endif + +#if defined(FIRST) +template <class A = double> +struct S10 {}; +#elif defined(SECOND) +template <class A = double> +struct S10 {}; +#else +using TemplateParameters::S10; +#endif + +#if defined(FIRST) +template <template<int> class A = S9> +struct S11 {}; +#elif defined(SECOND) +template <template<int> class A = S9> +struct S11 {}; +#else +using TemplateParameters::S11; +#endif + +// FIXME: It looks like we didn't implement ODR check for template variables. +// S12, S13 and S14 show this. +#if defined(FIRST) +template <int A = 43> +int S12 {}; +#elif defined(SECOND) +template <int A = 44> +int S12 {}; +#else +using TemplateParameters::S12; +#endif + +#if defined(FIRST) +template <class A = double> +int S13 {}; +#elif defined(SECOND) +template <class A = int> +int S13 {}; +#else +using TemplateParameters::S13; +#endif + +#if defined(FIRST) +template <class A> +int S14 {}; +#elif defined(SECOND) +template <class B> +int S14 {}; +#else +using TemplateParameters::S14; +#endif + #define DECLS #if defined(FIRST) || defined(SECOND) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits