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, Simon