re PR c++/60686 (message " only declarations of constructors can be ‘explicit’ "...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 9 Jul 2014 22:44:42 +0000 (22:44 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 9 Jul 2014 22:44:42 +0000 (22:44 +0000)
/cp
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.

/testsuite
2014-07-09  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60686
* g++.dg/cpp0x/explicit8.C: New.

From-SVN: r212415

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/explicit8.C [new file with mode: 0644]

index 6174193cb89577312d4845722bd1f88f5c56277c..5827bbdf3de5c32f774976eae764026c78caa345 100644 (file)
@@ -1,3 +1,10 @@
+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
index 5ab8ccd2588b08ca516d42c2563d911e2bf35c1a..1ade5861d581e0b67821b690c3f64be15566d88a 100644 (file)
@@ -10117,9 +10117,16 @@ grokdeclarator (const cp_declarator *declarator,
 
   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;
     }
 
index 675e3431b10b69d85465ee4e1a250585fad82b47..f4ccc1fda68c4fade692f371c0b9db46beafc6be 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit8.C b/gcc/testsuite/g++.dg/cpp0x/explicit8.C
new file mode 100644 (file)
index 0000000..acacf97
--- /dev/null
@@ -0,0 +1,22 @@
+// 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" }
+};