blob: 7bab882da7d9f56eda0c0c8f498d6603980a6e6a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// PR c++/97099
// { dg-do compile { target c++17 } }
// [temp.deduct.guide]p3: Two deduction guide declarations in the same
// translation unit for the same class template shall not have equivalent
// parameter-declaration-clauses.
template<typename> struct S { };
template<typename> struct X { };
S() -> S<int>; // { dg-message "previously defined here|old declaration" }
S() -> S<int>; // { dg-error "redefinition" }
X() -> X<int>;
S() -> S<float>; // { dg-error "ambiguating new declaration of" }
S(bool) -> S<int>; // { dg-message "previously defined here" }
explicit S(bool) -> S<int>; // { dg-error "redefinition" }
explicit S(char) -> S<int>; // { dg-message "previously defined here" }
S(char) -> S<int>; // { dg-error "redefinition" }
template<typename T> S(T, T) -> S<int>; // { dg-message "previously declared here" }
template<typename T> X(T, T) -> X<int>;
template<typename T> S(T, T) -> S<int>; // { dg-error "redefinition" }
// OK: Use SFINAE.
template<typename T> S(T) -> S<typename T::foo>;
template<typename T> S(T) -> S<typename T::bar>;
// OK: Non-template wins.
S(int) -> S<int>;
template<typename T = int> S(int) -> S<char>;
|