aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@gcc.gnu.org>2016-01-16 02:27:36 +0000
committerPatrick Palka <ppalka@gcc.gnu.org>2016-01-16 02:27:36 +0000
commitaa2500e9bc6ce022c604fefb5f9c60d6fd7134f8 (patch)
tree945a72ee17fb7ace0b1b95f89bde543d3b2979f0 /gcc
parent22c8388fc6f28e5ed3d9bbf20574c704763f6c1f (diff)
downloadgcc-aa2500e9bc6ce022c604fefb5f9c60d6fd7134f8.zip
gcc-aa2500e9bc6ce022c604fefb5f9c60d6fd7134f8.tar.gz
gcc-aa2500e9bc6ce022c604fefb5f9c60d6fd7134f8.tar.bz2
re PR c++/68936 (ICE: tree check: expected call_expr, have target_expr in build_min_non_dep_call_vec, at cp/tree.c:2744)
Fix PR c++/68936 gcc/cp/ChangeLog: PR c++/68936 * tree.c (build_min_non_dep_call_vec): Don't retain the KOENIG_LOOKUP_P flag of the non-dependent expression that's been built. (build_min_non_dep_op_overload): Instead, do it here. gcc/testsuite/ChangeLog: PR c++/68936 * g++.dg/template/pr68936.C: New test. From-SVN: r232461
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/tree.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr68936.C20
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ba08d09..fbf8064 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-16 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/68936
+ * tree.c (build_min_non_dep_call_vec): Don't retain the
+ KOENIG_LOOKUP_P flag of the non-dependent expression that's
+ been built.
+ (build_min_non_dep_op_overload): Instead, do it here.
+
2016-01-15 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/68271
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index e918252..d4cf310 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2747,7 +2747,6 @@ build_min_non_dep_call_vec (tree non_dep, tree fn, vec<tree, va_gc> *argvec)
non_dep = TREE_OPERAND (non_dep, 0);
TREE_TYPE (t) = TREE_TYPE (non_dep);
TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep);
- KOENIG_LOOKUP_P (t) = KOENIG_LOOKUP_P (non_dep);
return convert_from_reference (t);
}
@@ -2810,6 +2809,11 @@ build_min_non_dep_op_overload (enum tree_code op,
call = build_min_non_dep_call_vec (non_dep, fn, args);
release_tree_vector (args);
+ tree call_expr = call;
+ if (REFERENCE_REF_P (call_expr))
+ call_expr = TREE_OPERAND (call_expr, 0);
+ KOENIG_LOOKUP_P (call_expr) = KOENIG_LOOKUP_P (non_dep);
+
return call;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 451003a..600329a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-16 Patrick Palka <ppalka@gcc.gnu.org>
+
+ PR c++/68936
+ * g++.dg/template/pr68936.C: New test.
+
2016-01-15 David Edelsohn <dje.gcc@gmail.com>
PR target/68609
diff --git a/gcc/testsuite/g++.dg/template/pr68936.C b/gcc/testsuite/g++.dg/template/pr68936.C
new file mode 100644
index 0000000..ecfc09e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr68936.C
@@ -0,0 +1,20 @@
+// PR c++/68936
+
+class A {};
+
+struct predefined_macros {
+ struct B {
+ A (predefined_macros::*generator)();
+ };
+};
+
+template <typename> class C {
+ void m_fn1();
+ predefined_macros predef;
+};
+
+predefined_macros::B m;
+
+template <typename ContextT> void C<ContextT>::m_fn1() {
+ (predef.*m.generator)();
+}