[cfe-dev] Unneeded declarations invalidation

Douglas Gregor dgregor at apple.com
Mon Jul 20 11:56:14 PDT 2009


On Jul 7, 2009, at 12:48 AM, Enea Zaffanella wrote:

> Eli Friedman wrote:
>> On Thu, Jul 2, 2009 at 1:30 AM, Abramo  
>> Bagnara<abramobagnara at tin.it> wrote:
>>> The following typescript show what happens when trying to compile a
>>> simple C source not legal for C99 standard, but accepted and  
>>> compiled by
>>> gcc.
>
> [...SNIP...]
>
>>> OTOH in both cases, I'd like to avoid to invalidate the  
>>> declaration and
>>> thus to inhibit ast generation if this is not strictly needed.
>> Mmm... yeah, even if we don't fix this, we probably don't need to  
>> mark
>> the declaration invalid; it's well-formed in any case.
>> -Eli
>
> Hello.
>
> Please find attached a small patch that fixes what is, to my  
> understanding, another occurrence of an unneeded declaration  
> invalidation (triggered by non-standard use of VM types).
>
> The testcase is the following:
> ====================
> void p(int a) {
>  struct {
>    char x[(int)(char*)2 - 4000];
>    char y[a];
>  } f;
> }
> [snip]
>
> Hence, the error is still reported as it was,
> but the AST generation is more faithful to the original.
> The latter property is important for clients such as ours.
>
> Cheers,
> Enea Zaffanella.
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp	(revision 74831)
> +++ lib/Sema/SemaDecl.cpp	(working copy)
> @@ -3962,12 +3962,12 @@
>       Diag(Loc, diag::warn_illegal_constant_array_size);
>       T = FixedTy;
>     } else {
> +      // Do not unnecessarily invalidate declaration
> +      // (the AST is well-formed anyway).
>       if (SizeIsNegative)
>         Diag(Loc, diag::err_typecheck_negative_array_size);
>       else
>         Diag(Loc, diag::err_typecheck_field_variable_size);
> -      T = Context.IntTy;
> -      InvalidDecl = true;
>     }
>   }

The real problem here is that we're replacing the type of the field  
with 'int', when there's no reason to do that. However, I feel that it  
is important to mark this declaration as invalid, because it *is*  
invalid. So, I've committed the change not to replace the type with  
'int', but the declaration is still marked invalid:

	http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20090720/019240.html

Thanks again!

	- Doug



More information about the cfe-dev mailing list