diff options
-rw-r--r-- | gcc/cp/tree.cc | 11 | ||||
-rw-r--r-- | gcc/cp/typeck2.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent29.C | 13 |
3 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc index 417c92b..dc4126f 100644 --- a/gcc/cp/tree.cc +++ b/gcc/cp/tree.cc @@ -3601,7 +3601,12 @@ build_min_non_dep (enum tree_code code, tree non_dep, ...) TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep); for (i = 0; i < length; i++) - TREE_OPERAND (t, i) = va_arg (p, tree); + { + tree x = va_arg (p, tree); + TREE_OPERAND (t, i) = x; + if (x && !TYPE_P (x)) + TREE_SIDE_EFFECTS (t) |= TREE_SIDE_EFFECTS (x); + } va_end (p); return convert_from_reference (t); @@ -3636,6 +3641,10 @@ 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); + if (argvec) + for (tree x : *argvec) + if (x && !TYPE_P (x)) + TREE_SIDE_EFFECTS (t) |= TREE_SIDE_EFFECTS (x); return convert_from_reference (t); } diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc index 309903a..a75f4f8 100644 --- a/gcc/cp/typeck2.cc +++ b/gcc/cp/typeck2.cc @@ -2378,7 +2378,11 @@ build_m_component_ref (tree datum, tree component, tsubst_flags_t complain) /* Build an expression for "object + offset" where offset is the value stored in the pointer-to-data-member. */ ptype = build_pointer_type (type); - datum = fold_build_pointer_plus (fold_convert (ptype, datum), component); + datum = cp_convert (ptype, datum, complain); + if (!processing_template_decl) + datum = build2 (POINTER_PLUS_EXPR, ptype, + datum, convert_to_ptrofftype (component)); + datum = cp_fully_fold (datum); datum = cp_build_fold_indirect_ref (datum); if (datum == error_mark_node) return error_mark_node; diff --git a/gcc/testsuite/g++.dg/template/non-dependent29.C b/gcc/testsuite/g++.dg/template/non-dependent29.C new file mode 100644 index 0000000..41bd11a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent29.C @@ -0,0 +1,13 @@ +// PR c++/112427 + +struct A { int m; void f(); }; +struct B { A a; }; + +template<class T> +void f(B b) { + int A::*pd = &A::m; + b.a.*pd; + + void (A::*pf)() = &A::f; + (b.a.*pf)(); +} |