[cfe-commits] r64504 - in /cfe/trunk: include/clang/AST/ include/clang/Basic/ lib/AST/ lib/Analysis/ lib/CodeGen/ lib/Sema/ test/Analysis/ test/CodeGen/ test/Sema/

Daniel Dunbar daniel at zuster.org
Sat Feb 14 22:28:05 PST 2009


Hi Doug,

A few technical comments:

On Fri, Feb 13, 2009 at 3:20 PM, Douglas Gregor <dgregor at apple.com> wrote:
> +BUILTIN(alloca, "v*z", "f:stdlib.h")
> +BUILTIN(calloc, "v*zz", "f:stdlib.h")
> +BUILTIN(malloc, "v*z", "f:stdlib.h")

 + realloc ?

> +DIAG(note_previous_builtin_declaration, NOTE,
> +     "%0 was implicitly declared here with type %1")

This warning is lying, it wasn't implicitly declared here! What about:
"%0 is a builtin with type %1"

> @@ -491,9 +509,12 @@
>   diag::kind PrevDiag;
>   if (Old->isThisDeclarationADefinition())
>     PrevDiag = diag::note_previous_definition;
> -  else if (Old->isImplicit())
> -    PrevDiag = diag::note_previous_implicit_declaration;
> -  else
> +  else if (Old->isImplicit()) {
> +    if (Old->getBuiltinID())
> +      PrevDiag = diag::note_previous_builtin_declaration;
> +    else
> +      PrevDiag = diag::note_previous_implicit_declaration;
> +  } else
>     PrevDiag = diag::note_previous_declaration;

I think we need to do a bit more than this. This code will allow
merging of compatible declarations and reuse the new declaration not
the old one. I think we probably want to merely require the
declarations to be compatible, but make sure that we always use the
original builtin declaration.

Currently this is causing problems in IRgen with:
--
void *malloc();
void f0() { malloc(10); }
--
because the redeclaration of malloc is shadowing the original
declaration, yet the builtin ID is still set so IRgen expects the
prototype to match exactly to that of the builtin.

 - Daniel



More information about the cfe-commits mailing list