Viewing file: class-deduction74.C (1.12 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// 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 declared here|old declaration" } S() -> S<int>; // { dg-error "redeclared" } X() -> X<int>; S() -> S<float>; // { dg-error "ambiguating new declaration of" }
S(bool) -> S<int>; // { dg-message "previously declared here" } explicit S(bool) -> S<int>; // { dg-error "redeclared" }
explicit S(char) -> S<int>; // { dg-message "previously declared here" } S(char) -> S<int>; // { dg-error "redeclared" }
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 "redeclared" }
// 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>;
|