diff options
author | Haojian Wu <hokein.wu@gmail.com> | 2024-07-04 18:45:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-04 18:45:33 +0200 |
commit | 834ecc8b2ad44859f5bcaac9f92178e469390a51 (patch) | |
tree | 0b62dd9036e1a8b6731b6bea00714c54518e2ad6 /clang/test | |
parent | 0ccec541d526a1be84fdfcf8f42553965dadff78 (diff) | |
download | llvm-834ecc8b2ad44859f5bcaac9f92178e469390a51.zip llvm-834ecc8b2ad44859f5bcaac9f92178e469390a51.tar.gz llvm-834ecc8b2ad44859f5bcaac9f92178e469390a51.tar.bz2 |
[clang] CTAD alias: fix transformation for require-clause expr Part2. (#93533)
In the https://github.com/llvm/llvm-project/pull/90961 fix, we miss a
case where the undeduced template parameters of the underlying deduction
guide are not transformed, which leaves incorrect depth/index
information, and causes crashes when evaluating constraints.
This patch fix this missing case.
Fixes #92596
Fixes #92212
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/AST/ast-dump-ctad-alias.cpp | 27 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx20-ctad-type-alias.cpp | 27 |
2 files changed, 53 insertions, 1 deletions
diff --git a/clang/test/AST/ast-dump-ctad-alias.cpp b/clang/test/AST/ast-dump-ctad-alias.cpp index a4b6f06..6f07a62 100644 --- a/clang/test/AST/ast-dump-ctad-alias.cpp +++ b/clang/test/AST/ast-dump-ctad-alias.cpp @@ -53,6 +53,33 @@ Out2<double>::AInner t(1.0); // CHECK-NEXT: | | `-BuiltinType {{.*}} 'double' // CHECK-NEXT: | `-ParmVarDecl {{.*}} 'double' +// GH92596 +template <typename T0> +struct Out3 { + template<class T1, typename T2> + struct Foo { + // Deduction guide: + // template <typename T1, typename T2, typename V> + // Foo(V, T1) -> Foo<T1, T2>; + template<class V> requires Concept<T0, V> // V in require clause of Foo deduction guide: depth 1, index: 2 + Foo(V, T1); + }; +}; +template<class T3> +using AFoo3 = Out3<int>::Foo<T3, T3>; +AFoo3 afoo3{0, 1}; +// Verify occurrence V in the require-clause is transformed (depth: 1 => 0, index: 2 => 1) correctly. + +// CHECK: FunctionTemplateDecl {{.*}} implicit <deduction guide for AFoo3> +// CHECK-NEXT: |-TemplateTypeParmDecl {{.*}} class depth 0 index 0 T3 +// CHECK-NEXT: |-TemplateTypeParmDecl {{.*}} class depth 0 index 1 V +// CHECK-NEXT: |-BinaryOperator {{.*}} '<dependent type>' '&&' +// CHECK-NEXT: | |-UnresolvedLookupExpr {{.*}} '<dependent type>' lvalue (no ADL) = 'Concept' +// CHECK-NEXT: | | |-TemplateArgument type 'int' +// CHECK-NEXT: | | | `-BuiltinType {{.*}} 'int' +// CHECK-NEXT: | | `-TemplateArgument type 'type-parameter-0-1' +// CHECK-NEXT: | | `-TemplateTypeParmType {{.*}} 'type-parameter-0-1' dependent depth 0 index 1 + template <typename... T1> struct Foo { Foo(T1...); diff --git a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp index 3dafe82..a369ce6 100644 --- a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp +++ b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp @@ -266,7 +266,7 @@ template <typename U> using Bar = Foo<U>; // expected-note {{could not match 'Foo<type-parameter-0-0>' against 'int'}} \ // expected-note {{implicit deduction guide declared as 'template <typename U> requires __is_deducible(test18::Bar, Foo<type-parameter-0-0>) Bar(Foo<type-parameter-0-0>) -> Foo<type-parameter-0-0>'}} \ // expected-note {{candidate template ignored: constraints not satisfied}} \ - // expected-note {{implicit deduction guide declared as 'template <typename T> requires False<T> && __is_deducible(test18::Bar, Foo<int>) Bar(type-parameter-0-0) -> Foo<int>'}} \ + // expected-note {{implicit deduction guide declared as 'template <typename T> requires False<type-parameter-0-0> && __is_deducible(test18::Bar, Foo<int>) Bar(type-parameter-0-0) -> Foo<int>'}} \ // expected-note {{candidate function template not viable}} \ // expected-note {{implicit deduction guide declared as 'template <typename U> requires __is_deducible(test18::Bar, Foo<type-parameter-0-0>) Bar() -> Foo<type-parameter-0-0>'}} @@ -414,4 +414,29 @@ struct A1 { template <typename U> using AFoo = A1<int>::A2<int>::Foo<U>; AFoo case3(1); + +// Case4: crashes on the constexpr evaluator due to the mixed-up index for the +// template parameters `V`. +template<class T, typename T2> +struct Case4 { + template<class V> requires C<V> + Case4(V, T); +}; + +template<class T2> +using ACase4 = Case4<T2, T2>; +ACase4 case4{0, 1}; + } // namespace test24 + +namespace GH92212 { +template<typename T, typename...Us> +struct A{ + template<typename V> requires __is_same(V, int) + A(V); +}; + +template<typename...TS> +using AA = A<int, TS...>; +AA a{0}; +} |