decl.c (start_decl): Improve permerror location.
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 8 Jan 2019 09:41:36 +0000 (09:41 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 8 Jan 2019 09:41:36 +0000 (09:41 +0000)
/cp
2019-01-08  Paolo Carlini  <paolo.carlini@oracle.com>

* decl.c (start_decl): Improve permerror location.

/testsuite
2019-01-08  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/diagnostic/out-of-class-redeclaration.C: New.

From-SVN: r267675

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/diagnostic/out-of-class-redeclaration.C [new file with mode: 0644]

index 32c7f40..f8d3d93 100644 (file)
@@ -1,3 +1,7 @@
+2019-01-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (start_decl): Improve permerror location.
+
 2019-01-08  Jonathan Wakely  <jwakely@redhat.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index f456c07..7e4e93c 100644 (file)
@@ -5202,7 +5202,8 @@ start_decl (const cp_declarator *declarator,
       if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl)
          /* Aliases are definitions. */
          && !alias)
-       permerror (input_location, "declaration of %q#D outside of class is not definition",
+       permerror (declarator->id_loc,
+                  "declaration of %q#D outside of class is not definition",
                   decl);
     }
 
index 48a6a53..bc94087 100644 (file)
@@ -1,3 +1,7 @@
+2019-01-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/diagnostic/out-of-class-redeclaration.C: New.
+
 2019-01-08  Iain Sandoe  <iain@sandoe.co.uk>
 
        * c-c++-common/builtin-has-attribute-3.c: Skip tests requiring symbol
diff --git a/gcc/testsuite/g++.dg/diagnostic/out-of-class-redeclaration.C b/gcc/testsuite/g++.dg/diagnostic/out-of-class-redeclaration.C
new file mode 100644 (file)
index 0000000..9dba8eb
--- /dev/null
@@ -0,0 +1,13 @@
+// Adapted from g++.old-deja/g++.law/arm8.C
+
+struct K {
+  void f(int);
+};
+
+void K::f(int);  // { dg-error "6:declaration of .void K::f\\(int\\). outside of class" }
+
+struct L {
+  void g(int) {}
+};
+
+void L::g(int);  // { dg-error "6:declaration of .void L::g\\(int\\). outside of class" }