On Sat, 16 Sep 2023, Jason Merrill wrote: > On 9/15/23 12:03, Patrick Palka wrote: > > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > > trunk? > > > > -- >8 -- > > > > Here convert_to_void always completes the type of an INDIRECT_REF or > > VAR_DECL expression, but according to [expr.context] an lvalue-to-rvalue > > conversion is applied to a discarded-value expression only if "the > > expression is a glvalue of volatile-qualified type". This patch restricts > > convert_to_void's type completion accordingly. > > > > PR c++/111419 > > > > gcc/cp/ChangeLog: > > > > * cvt.cc (convert_to_void) <case INDIRECT_REF>: Only call > > complete_type if the type is volatile and the INDIRECT_REF > > isn't an implicit one. > > Hmm, what does implicit have to do with it? The expression forms listed in > https://eel.is/c++draft/expr.context#2 include "id-expression"...
When there's an implicit INDIRECT_REF, I reckoned the type of the id-expression is really a reference type, which can't be cv-qualified? > > > diff --git a/gcc/testsuite/g++.dg/expr/discarded1a.C > > b/gcc/testsuite/g++.dg/expr/discarded1a.C > > new file mode 100644 > > index 00000000000..5516ff46fe9 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/expr/discarded1a.C > > @@ -0,0 +1,16 @@ > > +// PR c++/111419 > > + > > +struct Incomplete; > > + > > +template<class T, int> struct Holder { T t; }; // { dg-error "incomplete" } > > + > > +extern volatile Holder<Incomplete, 0> a; > > +extern volatile Holder<Incomplete, 1>& b; > > +extern volatile Holder<Incomplete, 2>* c; > > + > > +int main() { > > + a; // { dg-message "required from here" } > > + b; // { dg-warning "implicit dereference will not access object" } > > + // { dg-bogus "required from here" "" { target *-*-* } .-1 } > > ...so it seems to me this line should get the lvalue-rvalue conversion (and > not the warning about no access). > > > + *c; // { dg-message "required from here" } > > +} > >