+2014-07-09 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/60686
+ * decl.c (grokdeclarator): Adjust error messages about 'explicit'
+ outside class declaration, in friend declaration, and neither on
+ constructor nor conversion operator.
+
2014-07-09 Paolo Carlini <paolo.carlini@oracle.com>
DR 1584
if (explicitp == 1 || (explicitp && friendp))
{
- /* [dcl.fct.spec] The explicit specifier shall only be used in
- declarations of constructors within a class definition. */
- error ("only declarations of constructors can be %<explicit%>");
+ /* [dcl.fct.spec] (C++11) The explicit specifier shall be used only
+ in the declaration of a constructor or conversion function within
+ a class definition. */
+ if (!current_class_type)
+ error ("%<explicit%> outside class declaration");
+ else if (friendp)
+ error ("%<explicit%> in friend declaration");
+ else
+ error ("only declarations of constructors and conversion operators "
+ "can be %<explicit%>");
explicitp = 0;
}
+2014-07-09 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/60686
+ * g++.dg/cpp0x/explicit8.C: New.
+
2014-07-09 Paolo Carlini <paolo.carlini@oracle.com>
DR 1584
--- /dev/null
+// PR c++/60686
+// { dg-do compile { target c++11 } }
+
+struct A {
+ explicit operator int() const;
+};
+
+explicit inline A::operator int() const { return 1; } // { dg-error "'explicit' outside class declaration" }
+
+struct B {
+ explicit void f(); // { dg-error "only declarations of constructors and conversion operators can be 'explicit'" }
+};
+
+explicit void B::f() { } // { dg-error "'explicit' outside class declaration" }
+
+struct C {
+ explicit C(int);
+};
+
+struct D {
+ explicit friend C::C(int); // { dg-error "'explicit' in friend declaration" }
+};