// 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 struct S { }; template struct X { }; S() -> S; // { dg-message "previously declared here|old declaration" } S() -> S; // { dg-error "redeclared" } X() -> X; S() -> S; // { dg-error "ambiguating new declaration of" } S(bool) -> S; // { dg-message "previously declared here" } explicit S(bool) -> S; // { dg-error "redeclared" } explicit S(char) -> S; // { dg-message "previously declared here" } S(char) -> S; // { dg-error "redeclared" } template S(T, T) -> S; // { dg-message "previously declared here" } template X(T, T) -> X; template S(T, T) -> S; // { dg-error "redeclared" } // OK: Use SFINAE. template S(T) -> S; template S(T) -> S; // OK: Non-template wins. S(int) -> S; template S(int) -> S;