This full-expression is potentially constant because the LHS is, but we
can't fold_non_constant_expr the RHS because it involves a
statement-expression. So let's treat it as value-dependent to avoid
trying to fold it.
Tested x86_64-pc-linux-gnu, applying to trunk.
commit 3b2ed7d426c6f7f2b0c5403c98245c5fef4006be
Author: Jason Merrill <ja...@redhat.com>
Date: Thu Jan 12 14:30:31 2012 -0500
PR c++/51714
* pt.c (value_dependent_expression_p): Treat STMT_EXPR as
value-dependent.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 97a9294..f2b4c8e 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19526,6 +19526,11 @@ value_dependent_expression_p (tree expression)
return false;
}
+ case STMT_EXPR:
+ /* Treat a GNU statement expression as dependent to avoid crashing
+ under fold_non_dependent_expr; it can't be constant. */
+ return true;
+
default:
/* A constant expression is value-dependent if any subexpression is
value-dependent. */
diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr14.C b/gcc/testsuite/g++.dg/ext/stmtexpr14.C
new file mode 100644
index 0000000..5f3ff0d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/stmtexpr14.C
@@ -0,0 +1,12 @@
+// PR c++/51714
+
+template <typename T>
+void Foo()
+{
+ true || !__extension__ ({ int verbose = 2; verbose <= 3; });
+}
+
+int main()
+{
+ Foo<int>();
+}