}
}
- if (deduction_guide_p (olddecl)
- && deduction_guide_p (newdecl))
- return G_("deduction guide %q+D redeclared");
-
/* [class.compare.default]: A definition of a comparison operator as
defaulted that appears in a class shall be the first declaration of
that function. */
}
}
- if (deduction_guide_p (olddecl)
- && deduction_guide_p (newdecl))
- return G_("deduction guide %q+D redeclared");
-
/* Core issue #226 (C++11):
If a friend function template declaration specifies a
DECL_CXX_DESTRUCTOR_P (decl) = 1;
DECL_NAME (decl) = dtor_identifier;
break;
+ case sfk_deduction_guide:
+ /* Give deduction guides a definition even though they don't really
+ have one: the restriction that you can't repeat a deduction guide
+ makes them more like a definition anyway. */
+ DECL_INITIAL (decl) = void_node;
+ break;
default:
break;
}
--- /dev/null
+// PR c++/106604
+// { dg-do compile { target c++17 } }
+// { dg-additional-options "-Wunused-function" }
+
+namespace {
+ template<class T> struct A { A(...); };
+ A(bool) -> A<bool>; // { dg-bogus "never defined" }
+}
template<typename> struct S { };
template<typename> struct X { };
-S() -> S<int>; // { dg-message "previously declared here|old declaration" }
-S() -> S<int>; // { dg-error "redeclared" }
+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 declared here" }
-explicit S(bool) -> S<int>; // { dg-error "redeclared" }
+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 declared here" }
-S(char) -> S<int>; // { dg-error "redeclared" }
+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 "redeclared" }
+template<typename T> S(T, T) -> S<int>; // { dg-error "redefinition" }
// OK: Use SFINAE.
template<typename T> S(T) -> S<typename T::foo>;