diff options
author | Jason Merrill <jason@redhat.com> | 2023-03-23 15:57:39 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2023-03-28 11:26:03 -0400 |
commit | 0e8fc610fb7112deb8c33c673a52983368dde9b7 (patch) | |
tree | deaa252b7d72c7ef6414e4a4089ebca4017b5256 | |
parent | 5a923516ae61ddc6dd863891db13189cbf392411 (diff) | |
download | gcc-0e8fc610fb7112deb8c33c673a52983368dde9b7.zip gcc-0e8fc610fb7112deb8c33c673a52983368dde9b7.tar.gz gcc-0e8fc610fb7112deb8c33c673a52983368dde9b7.tar.bz2 |
c-family: -Wsequence-point and COMPONENT_REF [PR107163]
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.cc (verify_tree): Don't use sequenced handling
for COMPONENT_REF.
gcc/testsuite/ChangeLog:
* g++.dg/warn/Wsequence-point-5.C: New test.
-rw-r--r-- | gcc/c-family/c-common.cc | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wsequence-point-5.C | 37 |
2 files changed, 43 insertions, 1 deletions
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index bfb950e..2b4c82f 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -2154,12 +2154,17 @@ verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp, 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. diff --git a/gcc/testsuite/g++.dg/warn/Wsequence-point-5.C b/gcc/testsuite/g++.dg/warn/Wsequence-point-5.C new file mode 100644 index 0000000..0354ab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsequence-point-5.C @@ -0,0 +1,37 @@ +// 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; +} |