aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-02-14 16:31:26 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-02-14 16:31:26 +0000
commit486c529987375143c1ca508a76c751cb07c56324 (patch)
tree45b312cbb62ea9007dcfee164a0a09a083e6fbbe /gcc
parent34c58a43ecaeae30dce71abfd79c3c835fd09663 (diff)
downloadgcc-486c529987375143c1ca508a76c751cb07c56324.zip
gcc-486c529987375143c1ca508a76c751cb07c56324.tar.gz
gcc-486c529987375143c1ca508a76c751cb07c56324.tar.bz2
[C++ PATCH]: instantiation via vtable marking
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate5.C9
4 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4955bf9..673d6e3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 2da6f90..d2693ce 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0f08e15..4fb11df 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.dg/template/instantiate5.C b/gcc/testsuite/g++.dg/template/instantiate5.C
index 896313d..d64092e 100644
--- a/gcc/testsuite/g++.dg/template/instantiate5.C
+++ b/gcc/testsuite/g++.dg/template/instantiate5.C
@@ -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;