@@ -207,13 +207,14 @@ namespace test15 {
207
207
template <class T > struct Foo { Foo(T); };
208
208
209
209
template <class V > using AFoo = Foo<V *>;
210
- template <typename > concept False = false ;
210
+ template <typename > concept False = false ; // #test15_False
211
211
template <False W>
212
- using BFoo = AFoo<W>; // expected-note {{candidate template ignored: constraints not satisfied [with V = int]}} \
213
- // expected-note {{cannot deduce template arguments for 'BFoo' from 'Foo<int *>'}} \
214
- // expected-note {{implicit deduction guide declared as 'template <class V> requires __is_deducible(AFoo, Foo<V *>) && __is_deducible(test15::BFoo, Foo<V *>) BFoo(V *) -> Foo<V *>}} \
215
- // expected-note {{candidate template ignored: could not match 'Foo<V *>' against 'int *'}} \
216
- // expected-note {{template <class V> requires __is_deducible(AFoo, Foo<V *>) && __is_deducible(test15::BFoo, Foo<V *>) BFoo(Foo<V *>) -> Foo<V *>}}
212
+ using BFoo = AFoo<W>; // expected-note {{candidate template ignored: constraints not satisfied [with W = int]}} \
213
+ // expected-note@-1 {{because 'int' does not satisfy 'False'}} \
214
+ // expected-note@#test15_False {{because 'false' evaluated to false}} \
215
+ // expected-note {{implicit deduction guide declared as 'template <False<> W> requires __is_deducible(AFoo, Foo<W *>) && __is_deducible(test15::BFoo, Foo<W *>) BFoo(W *) -> Foo<W *>}} \
216
+ // expected-note {{candidate template ignored: could not match 'Foo<W *>' against 'int *'}} \
217
+ // expected-note {{template <False<> W> requires __is_deducible(AFoo, Foo<W *>) && __is_deducible(test15::BFoo, Foo<W *>) BFoo(Foo<W *>) -> Foo<W *>}}
217
218
int i = 0 ;
218
219
AFoo a1 (&i); // OK, deduce Foo<int *>
219
220
@@ -441,6 +442,32 @@ ACase4 case4{0, 1};
441
442
442
443
} // namespace test24
443
444
445
+ namespace test25 {
446
+
447
+ template <typename T, typename ...Us>
448
+ struct A {
449
+ template <typename V> requires __is_same (V, int )
450
+ A(V);
451
+ };
452
+
453
+ template <typename ...TS>
454
+ using AA = A<int , TS...>;
455
+
456
+ template <typename ...US>
457
+ using BB = AA<US...>; // #test25_BB
458
+
459
+ BB a{0 };
460
+ static_assert (__is_same(decltype (a), A<int >));
461
+ // FIXME: The template parameter list of generated deduction guide is not strictly conforming,
462
+ // as the pack occurs prior to the non-packs.
463
+ BB b{0 , 1 };
464
+ // expected-error@-1 {{no viable}}
465
+ // expected-note@#test25_BB 2{{not viable}}
466
+ // expected-note@#test25_BB {{template <typename ...US, typename V> requires __is_same(V, int) && __is_deducible(AA, A<int, US...>) && __is_deducible(test25::BB, A<int, US...>) BB(V) -> A<int, US...>}}
467
+ // expected-note@#test25_BB {{implicit deduction guide}}
468
+
469
+ }
470
+
444
471
namespace GH92212 {
445
472
template <typename T, typename ...Us>
446
473
struct A {
@@ -526,6 +553,7 @@ void foo() { test<{1, 2, 3}>(); }
526
553
527
554
} // namespace GH113518
528
555
556
+ // FIXME: This is accepted by GCC: https://gcc.godbolt.org/z/f3rMfbacz
529
557
namespace GH125821 {
530
558
template <typename T>
531
559
struct A { A(T){} };
@@ -539,3 +567,22 @@ using C = Proxy< A<T> >;
539
567
C test{ 42 }; // expected-error {{no viable constructor or deduction guide for deduction of template arguments}}
540
568
541
569
} // namespace GH125821
570
+
571
+ namespace GH133132 {
572
+
573
+ template <class T >
574
+ struct A {};
575
+
576
+ template <class T >
577
+ using Foo = A<A<T>>;
578
+
579
+ template <class T >
580
+ using Bar = Foo<T>;
581
+
582
+ template <class T = int >
583
+ using Baz = Bar<T>;
584
+
585
+ Baz a{};
586
+ static_assert (__is_same(decltype (a), A<A<int >>));
587
+
588
+ } // namespace GH133132
0 commit comments