[C++ PATCH]: instantiation via vtable marking
authorNathan Sidwell <nathan@acm.org>
Wed, 14 Feb 2018 16:31:26 +0000 (16:31 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 14 Feb 2018 16:31:26 +0000 (16:31 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00850.html
gcc/cp/
* decl2.c (mark_vtable_entries): Set input_location to decl's.
(c_parse_final_cleanups): Restore input_location after emitting
vtables.

gcc/testsuite/
* g++.dg/template/instantiate5.C: Adjust required-from loc.

From-SVN: r257665

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/instantiate5.C

index 4955bf9e1a0ef43d045db6578ea43b0e58b54005..673d6e32453d02653de0ee21ca56fb934308cd1b 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-14  Nathan Sidwell  <nathan@acm.org>
+
+       * decl2.c (mark_vtable_entries): Set input_location to decl's.
+       (c_parse_final_cleanups): Restore input_location after emitting
+       vtables.
+
 2018-02-14  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * cp-tree.h (do_auto_deduction (tree, tree, tree)): Remove.
index 2da6f9023c5b764947ffc998a85622a4862b1cee..d2693ce458b6d6220df8f2c97be54e0f13475af4 100644 (file)
@@ -1825,6 +1825,11 @@ mark_vtable_entries (tree decl)
         function, so we emit the thunks there instead.  */
       if (DECL_THUNK_P (fn))
        use_thunk (fn, /*emit_p=*/0);
+      /* Set the location, as marking the function could cause
+         instantiation.  We do not need to preserve the incoming
+         location, as we're called from c_parse_final_cleanups, which
+         takes care of that.  */
+      input_location = DECL_SOURCE_LOCATION (fn);
       mark_used (fn);
     }
 }
@@ -4727,6 +4732,9 @@ c_parse_final_cleanups (void)
            reconsider = true;
            keyed_classes->unordered_remove (i);
          }
+      /* The input_location may have been changed during marking of
+        vtable entries.  */
+      input_location = locus_at_end_of_parsing;
 
       /* Write out needed type info variables.  We have to be careful
         looping through unemitted decls, because emit_tinfo_decl may
index 0f08e15e2acefdf0b19b1f3e12699576a115af9e..4fb11dfa0111a23e3849069db4c27ddaf7aa622e 100644 (file)
@@ -1,3 +1,7 @@
+2018-02-14  Nathan Sidwell  <nathan@acm.org>
+
+       * g++.dg/template/instantiate5.C: Adjust required-from loc.
+
 2018-02-14  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        * gcc.target/powerpc/altivec-consts.c:  Update compile stanzas.
index 896313d14d50150947983467af4f3f7694445a76..d64092eb1a80c6c7509c26afb7033435852a8968 100644 (file)
@@ -18,7 +18,12 @@ struct B
 
 template <typename T> struct C
 {
-  virtual void bar() const { T::foo(); } // { dg-error "no matching function" }
+  virtual void bar() const     // { dg-message "required" }
+  {
+    T::foo(); // { dg-error "no matching function" }
+  }
 };
 
-C<B> c;                                // { dg-message "required" }
+C<B> c;
+
+int k;