decl.c (grokfndecl): Use the location_t argument in two more places.
authorPaolo Carlini <paolo.carlini@oracle.com>
Sun, 10 Jun 2018 21:19:07 +0000 (21:19 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sun, 10 Jun 2018 21:19:07 +0000 (21:19 +0000)
/cp
2018-06-10  Paolo Carlini  <paolo.carlini@oracle.com>

* decl.c (grokfndecl): Use the location_t argument in two more places.

/testsuite
2018-06-10  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/template/friend64.C: New.
* g++.old-deja/g++.other/friend4.C: Test the location too.
* g++.old-deja/g++.pt/crash23.C: Likewise.

From-SVN: r261389

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/friend64.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.other/friend4.C
gcc/testsuite/g++.old-deja/g++.pt/crash23.C

index 68df05445171dcc8dd44969fbc4a08c418c41b05..bdf717f82fb0ec57bb957a30c578cbc7a4e8c031 100644 (file)
@@ -1,3 +1,7 @@
+2018-06-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (grokfndecl): Use the location_t argument in two more places.
+
 2018-06-06  Marek Polacek  <polacek@redhat.com>
 
        PR c++/85977
index 5d736e7d1ac726b0fdfa7b9b5e7d863912e8ba0f..688ba4a1442a8f884dd1466a28b021d81ba434eb 100644 (file)
@@ -8674,8 +8674,9 @@ grokfndecl (tree ctype,
   if (friendp && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR)
     {
       if (funcdef_flag)
-       error ("defining explicit specialization %qD in friend declaration",
-              orig_declarator);
+       error_at (location,
+                 "defining explicit specialization %qD in friend declaration",
+                 orig_declarator);
       else
        {
          tree fns = TREE_OPERAND (orig_declarator, 0);
@@ -8684,9 +8685,10 @@ grokfndecl (tree ctype,
          if (PROCESSING_REAL_TEMPLATE_DECL_P ())
            {
              /* Something like `template <class T> friend void f<T>()'.  */
-             error ("invalid use of template-id %qD in declaration "
-                    "of primary template",
-                    orig_declarator);
+             error_at (location,
+                       "invalid use of template-id %qD in declaration "
+                       "of primary template",
+                       orig_declarator);
              return NULL_TREE;
            }
 
index 34f298fdd6a2dfc92ab94df2796e9cb9a98a35c6..040cce2b770bec0377702af84266f3d7519826b0 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/template/friend64.C: New.
+       * g++.old-deja/g++.other/friend4.C: Test the location too.
+       * g++.old-deja/g++.pt/crash23.C: Likewise.
+
 2018-06-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        * gfortran.dg/inline_matmul_23.f90: New test.
diff --git a/gcc/testsuite/g++.dg/template/friend64.C b/gcc/testsuite/g++.dg/template/friend64.C
new file mode 100644 (file)
index 0000000..77a8c97
--- /dev/null
@@ -0,0 +1,6 @@
+template <class T> void foo (int);
+
+template <class T>
+class Q {
+  friend void foo<T> (int) { }  // { dg-error "15:defining explicit specialization" }
+};
index cd9e7fa107405d1529486f0a2b8e2b0a6b7b4951..a55184769072c7c4b93eea58ab0b4aecdc37cdc7 100644 (file)
@@ -11,7 +11,7 @@
 template <class A, class B> void foo();
 template <class C> class bar {
   int i; // { dg-message "" } private
-  template <class B> friend void foo<C,B>(); // { dg-error "" } bogus declaration
+  template <class B> friend void foo<C,B>(); // { dg-error "34:invalid use of template-id" }
 };
 template <class A, class B> void foo() {
   bar<A> baz; baz.i = 1;   // { dg-error "" } foo cannot access bar<int>::i
index 242624eebb883485f237534c3dabb2921223398a..ef37f95548e030b2198d7ea648fefeed13a7671e 100644 (file)
@@ -4,7 +4,7 @@ template <class A, class B> void foo();
 template <class C> class bar {
 public:
   int i;
-  template <class B> friend void foo<C,B>(); // { dg-error "" } template-id
+  template <class B> friend void foo<C,B>(); // { dg-error "34:invalid use of template-id" }
 };
 template <class A, class B> void foo() {
   bar<A> baz; baz.i = 1;