[cfe-dev] Member expression returns type with wrong qualifiers
Steve Naroff
snaroff at apple.com
Mon Feb 4 16:51:26 PST 2008
On Feb 4, 2008, at 3:59 PM, Eli Friedman wrote:
> On Feb 4, 2008 3:06 PM, Steve Naroff <snaroff at apple.com> wrote:
>> One solution is to extend Expr::isModifiableLvalue() and the
>> MemberExpr AST to return the underlying base type.
>
> That might fix this exact case, but it's not a general fix. Try
> something like the following:
> int a(const struct {int a;} * x) {
> int* y = &x->a;
> *y = 10;
> }
>
O.K. Here's a crazy idea...have you considered turning...
const struct whatever { int a; };
...into...
const struct whatever { const int a; };
In other words, pass down the const-ness to ActOnField()? Then the
qualifiers could be added to all the FieldDecls...
The only downside is distinguishing between "implicit/inherited"
qualifiers from qualifiers that are explicit in the source (but that
can obviously be fixed by saving the original type, if necessary).
This declaration-centric solution has some appeal...MemberExpr/Expr
wouldn't need to change.
snaroff
> (Note that we actually allow this for gcc compat, but the -pedantic
> warning that should show up doesn't show up.)
>
> Or the following:
> int a(volatile struct {int a;} * x) {
> x->a = 10;
> }
>
> Which will silently generate wrong code because it throws out the
> volatile qualifier.
> Pretty much anything that depends on qualifiers would require an
> independent fix for this issue, which seems like a bad idea.
>
> -Eli
More information about the cfe-dev
mailing list