aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-02-28 11:01:09 -0500
committerJason Merrill <jason@gcc.gnu.org>2013-02-28 11:01:09 -0500
commitc966f2deb7d1b4427e8f9c3a94f50e7d98887ac0 (patch)
treed9d1915fa9b4cfab0ccce1a8f1b2c9bdb127345e /gcc
parentf8f42513b06474966a1befff43dea81a7683b31a (diff)
downloadgcc-c966f2deb7d1b4427e8f9c3a94f50e7d98887ac0.zip
gcc-c966f2deb7d1b4427e8f9c3a94f50e7d98887ac0.tar.gz
gcc-c966f2deb7d1b4427e8f9c3a94f50e7d98887ac0.tar.bz2
re PR c++/56243 (ICE in tree check: expected field_decl, have identifier_node in fixed_type_or_null, at cp/class.c:6645)
PR c++/56243 * call.c (build_over_call): Avoid virtual lookup in a template. From-SVN: r196343
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c5
-rw-r--r--gcc/testsuite/g++.dg/template/virtual4.C30
3 files changed, 39 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a0e7405..90110de 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2013-02-28 Jason Merrill <jason@redhat.com>
+
+ PR c++/56243
+ * call.c (build_over_call): Avoid virtual lookup in a template.
+
2013-02-27 Jason Merrill <jason@redhat.com>
PR c++/56358
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 7c41421..4eb38ec 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -7033,7 +7033,10 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
if (!already_used)
mark_used (fn);
- if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0)
+ if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0
+ /* Don't mess with virtual lookup in fold_non_dependent_expr; virtual
+ functions can't be constexpr. */
+ && !in_template_function ())
{
tree t;
tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (argarray[0])),
diff --git a/gcc/testsuite/g++.dg/template/virtual4.C b/gcc/testsuite/g++.dg/template/virtual4.C
new file mode 100644
index 0000000..a2c7420b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/virtual4.C
@@ -0,0 +1,30 @@
+// PR c++/56243
+
+struct A
+{
+ virtual int String ();
+};
+
+struct F: A { };
+
+struct G
+{
+ F value;
+};
+
+struct D
+{
+ template <int>
+ void Verify()
+ {
+ G x;
+ F& name = x.value;
+ name.String();
+ }
+};
+
+int main()
+{
+ D d;
+ d.Verify<42>();
+}