The following fixes a mismatch in COMPOUND_EXPR handling in
tsubst_expr vs tsubst_stmt where the latter allows a stmt in
operand zero but the former doesn't.  This makes a difference
for the case at hand because when the COMPOUND_EXPR is wrapped
inside an ANNOTATE_EXPR it gets handled by tsubst_expr and when
not, tsubst_stmt successfully handles it and the contained
DECL_EXPR in operand zero.

The following makes handling of COMPOUND_EXPR in tsubst_expr
consistent with that of tsubst_stmt for the operand that doesn't
specify the result and thus the reason we choose either or the
other for substing.

Bootstrapped and tested on x86_64-unknown-linux-gnu, OK?

Thanks,
Richard.

        PR c++/114409
gcc/cp/
        * pt.cc (tsubst_expr): Recurse to COMPOUND_EXPR operand
        zero using tsubst_stmt, when that returns NULL return
        the subst operand one, mimicing what tsubst_stmt does.

gcc/testsuite/
        * g++.dg/pr114409.C: New testcase.
---
 gcc/cp/pt.cc                    | 5 ++++-
 gcc/testsuite/g++.dg/pr114409.C | 8 ++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/pr114409.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index bf4b89d8413..dae423a751f 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -20635,8 +20635,11 @@ 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,
+       tree op0 = tsubst_stmt (TREE_OPERAND (t, 0), args,
                                complain & ~tf_decltype, in_decl);
+       if (op0 == NULL_TREE)
+         /* If the first operand was a statement, we're done with it.  */
+         RETURN (RECUR (TREE_OPERAND (t, 1)));
        RETURN (build_x_compound_expr (EXPR_LOCATION (t),
                                       op0,
                                       RECUR (TREE_OPERAND (t, 1)),
diff --git a/gcc/testsuite/g++.dg/pr114409.C b/gcc/testsuite/g++.dg/pr114409.C
new file mode 100644
index 00000000000..6343fe8d9f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr114409.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+template <int> int t() {
+#pragma GCC unroll 4
+    while (int ThisEntry = 0) { } // { dg-bogus "ignoring loop annotation" "" 
{ xfail *-*-* } }
+    return 0;
+}
+int tt = t<1>();
-- 
2.35.3

Reply via email to