diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2016-01-16 02:27:36 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2016-01-16 02:27:36 +0000 |
commit | aa2500e9bc6ce022c604fefb5f9c60d6fd7134f8 (patch) | |
tree | 945a72ee17fb7ace0b1b95f89bde543d3b2979f0 /gcc | |
parent | 22c8388fc6f28e5ed3d9bbf20574c704763f6c1f (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/tree.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr68936.C | 20 |
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)(); +} |