On 11/7/23 10:08, Patrick Palka wrote:
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));
Hmm, passing decltype_flag to both op1 and the , is concerning. Can you
add a test with overloaded operator, where the RHS is a class with a
destructor?
Jason