re PR c++/65598 (Fix column location for 'explicit')
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 22 May 2015 14:14:38 +0000 (14:14 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 22 May 2015 14:14:38 +0000 (14:14 +0000)
/cp
2015-05-22  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/65598
* decl.c (grokdeclarator): Use the correct location in error
messages about 'explicit'.

/testsuite
2015-05-22  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/65598
* g++.dg/cpp0x/explicit9.C: New.
* g++.dg/cpp0x/explicit8.C: Check the locations too.

From-SVN: r223576

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

index 4dd8ec65cd8e17c4276d4989e2b59dea2251b154..047b0a14195b682fb71bb5a1ec92c563dc3e2480 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-22  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/65598
+       * decl.c (grokdeclarator): Use the correct location in error
+       messages about 'explicit'.
+
 2015-05-22  Marek Polacek  <polacek@redhat.com>
            Edward Smith-Rowland  <3dw4rd@verizon.net>
 
index 5396994f7fe0a66d2c95883e896d3de4e59576ef..06fbbd5451f5e0e16ce5f3ad8141c329f794c4c9 100644 (file)
@@ -10266,12 +10266,15 @@ grokdeclarator (const cp_declarator *declarator,
         in the declaration of a constructor or conversion function within
         a class definition.  */
       if (!current_class_type)
-       error ("%<explicit%> outside class declaration");
+       error_at (declspecs->locations[ds_explicit],
+                 "%<explicit%> outside class declaration");
       else if (friendp)
-       error ("%<explicit%> in friend declaration");
+       error_at (declspecs->locations[ds_explicit],
+                 "%<explicit%> in friend declaration");
       else
-       error ("only declarations of constructors and conversion operators "
-              "can be %<explicit%>");
+       error_at (declspecs->locations[ds_explicit],
+                 "only declarations of constructors and conversion operators "
+                 "can be %<explicit%>");
       explicitp = 0;
     }
 
index 6f795ade1b9e819f104aab77bfb9da86980278cb..a3305450b6548942e9a06d1e61cdfd6ea8702bc5 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-22  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/65598
+       * g++.dg/cpp0x/explicit9.C: New.
+       * g++.dg/cpp0x/explicit8.C: Check the locations too.
+
 2015-05-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/66251
index acacf97451a686f273a34b7486ec9907d0c8ca68..9a8ecb348c602538a477048280a7d2cd4d0fc30c 100644 (file)
@@ -5,18 +5,18 @@ struct A {
   explicit operator int() const;
 };
 
-explicit inline A::operator int() const { return 1; }  // { dg-error "'explicit' outside class declaration" }
+explicit inline A::operator int() const { return 1; }  // { dg-error "1:'explicit' outside class declaration" }
 
 struct B {
-  explicit void f();  // { dg-error "only declarations of constructors and conversion operators can be 'explicit'" }
+  explicit void f();  // { dg-error "3:only declarations of constructors and conversion operators can be 'explicit'" }
 };
 
-explicit void B::f() { }  // { dg-error "'explicit' outside class declaration" }
+explicit void B::f() { }  // { dg-error "1:'explicit' outside class declaration" }
 
 struct C {
   explicit C(int);
 };
 
 struct D {
-  explicit friend C::C(int);  // { dg-error "'explicit' in friend declaration" }
+  explicit friend C::C(int);  // { dg-error "3:'explicit' in friend declaration" }
 };
diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit9.C b/gcc/testsuite/g++.dg/cpp0x/explicit9.C
new file mode 100644 (file)
index 0000000..4afaafa
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/65598
+// { dg-do compile { target c++11 } }
+
+struct ExplicitTest
+{
+  explicit operator bool() const;
+};
+
+explicit ExplicitTest::operator bool() const  // { dg-error "1:'explicit' outside class declaration" }
+{
+  return true;
+}