The patch for PR91415 fixed -Wsequence-point to treat shifts and ARRAY_REF
as sequenced in C++17, and COMPONENT_REF as well. But this is unnecessary
for COMPONENT_REF, since the RHS is just a FIELD_DECL with no actual
evaluation, and in this testcase handling COMPONENT_REF as sequenced blows
up fast in a deep inheritance tree. Instead, look through it.
PR c++/107163
gcc/c-family/ChangeLog:
* c-common.c (verify_tree): Don't use sequenced handling
for COMPONENT_REF.
gcc/testsuite/ChangeLog:
* g++.dg/warn/Wsequence-point-5.C: New test.
case LSHIFT_EXPR:
case RSHIFT_EXPR:
- case COMPONENT_REF:
case ARRAY_REF:
if (cxx_dialect >= cxx17)
goto sequenced_binary;
goto do_default;
+ case COMPONENT_REF:
+ /* Treat as unary, the other operands aren't evaluated. */
+ x = TREE_OPERAND (x, 0);
+ writer = 0;
+ goto restart;
+
default:
do_default:
/* For other expressions, simply recurse on their operands.
--- /dev/null
+// PR c++/107163
+// { dg-additional-options "-Wsequence-point" }
+
+struct BaseType {
+ int i;
+};
+
+template< int Seq >
+class DerivedType : public DerivedType< Seq - 1 > { };
+
+template<>
+class DerivedType< -1 > : public BaseType { };
+
+int main() {
+ DerivedType< 400 > d;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ d.i = 42;
+ return d.i;
+}