On 11/5/24 4:13 AM, Simon Martin wrote:
Hi Jason,

On 5 Nov 2024, at 1:23, Jason Merrill wrote:

On 11/4/24 10:19 AM, Simon Martin wrote:
Hi Jason,

On 1 Nov 2024, at 16:31, Jason Merrill wrote:

On 11/1/24 5:07 AM, Simon Martin wrote:
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, and end up
calling
contains_placeholder_p with a SCOPE_REF, that it does not handle
well.

This patch fixes this by skipping the first operand of SCOPE_REFs
in
contains_placeholder_p.

Code in gcc/ shouldn't refer to tree codes from cp-tree.def.

We probably shouldn't do the strong-eval-order transformation when
processing_template_decl anyway.
Thanks, that makes sense. The attached updated patch skips the
wrapping when processing_template_decl, and also adds a test
case checking that -fstrong-eval-order processing is properly
done for instantiated templates.

Successfully tested on x86_64-pc-linux-gnu. OK for trunk?

OK.
Thanks, pushed to trunk as r15-4957-gb1d92aeb8583c8.

Since it’s a reject-valid regression, OK to back port to active
branches as well?

OK.

Jason

Reply via email to