bootstrapped and regtested on x86_64-pc-linxu-gnu, does this look OK for trunk?
-- >8 -- In the COMPOUND_EXPR case of tsubst_expr, we were redundantly clearing the tf_decltype flag when substituting the LHS and also neglecting to propagate it when substituting the RHS. This patch corrects this flag manipulation, which allows us to accept the below testcase. gcc/cp/ChangeLog: * pt.cc (tsubst_expr) <case COMPOUND_EXPR>: Don't redundantly clear tf_decltype when substituting the LHS. Propagate tf_decltype when substituting the RHS. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/decltype-call7.C: New test. --- gcc/cp/pt.cc | 9 ++++----- gcc/testsuite/g++.dg/cpp0x/decltype-call7.C | 9 +++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype-call7.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 521749df525..5f879287a58 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -20382,11 +20382,10 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) case COMPOUND_EXPR: { - tree op0 = tsubst_expr (TREE_OPERAND (t, 0), args, - complain & ~tf_decltype, in_decl); - RETURN (build_x_compound_expr (EXPR_LOCATION (t), - op0, - RECUR (TREE_OPERAND (t, 1)), + tree op0 = RECUR (TREE_OPERAND (t, 0)); + tree op1 = tsubst_expr (TREE_OPERAND (t, 1), args, + complain|decltype_flag, in_decl); + RETURN (build_x_compound_expr (EXPR_LOCATION (t), op0, op1, templated_operator_saved_lookups (t), complain|decltype_flag)); } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-call7.C b/gcc/testsuite/g++.dg/cpp0x/decltype-call7.C new file mode 100644 index 00000000000..4ce3e68381e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-call7.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +struct A; +template<class T> A f(); + +template<class T> +decltype(42, f<T>()) g(); + +using type = decltype(g<int>()); -- 2.43.0.rc0.23.g8be77c5de6