]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Defer -fstrong-eval-order processing to template instantiation time [PR117158]
authorSimon Martin <simon@nasilyan.com>
Tue, 5 Nov 2024 09:07:42 +0000 (10:07 +0100)
committerSimon Martin <simartin@gcc.gnu.org>
Tue, 5 Nov 2024 13:59:04 +0000 (14:59 +0100)
commit5fdd38d576c20d5a337b5c7d14108981d0751434
tree02db9973381761420058665374a256fb037922ac
parenta48d9c7fa3d23bf0c252040a47c484a44f1ab9ca
c++: Defer -fstrong-eval-order processing to template instantiation time [PR117158]

Since r10-3793-g1a37b6d9a7e57c, we ICE upon the following valid code
with -std=c++17 and above

=== cut here ===
struct Base {
  unsigned int *intarray;
};
template <typename T> struct Sub : public Base {
  bool Get(int i) {
    return (Base::intarray[++i] == 0);
  }
};
=== cut here ===

The problem is that from c++17 on, we use -fstrong-eval-order and need
to wrap the array access expression into a SAVE_EXPR. We do so at
template declaration time, and end up calling contains_placeholder_p
with a SCOPE_REF, that it does not handle well.

This patch fixes this by deferring the wrapping into SAVE_EXPR to
instantiation time for templates, when the SCOPE_REF will have been
turned into a COMPONENT_REF.

PR c++/117158

gcc/cp/ChangeLog:

* typeck.cc (cp_build_array_ref): Only wrap array expression
into a SAVE_EXPR at template instantiation time.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/eval-order13.C: New test.
* g++.dg/parse/crash77.C: New test.

(cherry picked from commit b1d92aeb8583c8d1491c97703680c5fb88ed1fe4)
gcc/cp/typeck.cc
gcc/testsuite/g++.dg/cpp1z/eval-order13.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/crash77.C [new file with mode: 0644]