r179430 - Don't replace an existing decl in the scope chains with its

Benjamin Kramer benny.kra at gmail.com
Sat Apr 13 06:30:47 PDT 2013


On 13.04.2013, at 02:20, John McCall <rjmccall at apple.com> wrote:

> Author: rjmccall
> Date: Fri Apr 12 19:20:21 2013
> New Revision: 179430
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=179430&view=rev
> Log:
> Don't replace an existing decl in the scope chains with its
> local-extern redeclaration;  type refinements, default arguments,
> etc. must all be locally scoped.

This broke MultiSource/Applications/sgefa.

Test case:
void foo() { char *malloc(); }
void bar() { char *malloc(); }

This used to compile without error, now complains about "conflicting types for 'malloc'".

- Ben

> 
> rdar://13535367
> 
> Modified:
>    cfe/trunk/lib/Sema/SemaDecl.cpp
>    cfe/trunk/test/Sema/extern-redecl.c
>    cfe/trunk/test/Sema/function-redecl.c
>    cfe/trunk/test/Sema/var-redecl.c
> 
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=179430&r1=179429&r2=179430&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Apr 12 19:20:21 2013
> @@ -4328,34 +4328,6 @@ Sema::RegisterLocallyScopedExternCDecl(N
>          "Decl is not a locally-scoped decl!");
>   // Note that we have a locally-scoped external with this name.
>   LocallyScopedExternCDecls[ND->getDeclName()] = ND;
> -
> -  if (!Previous.isSingleResult())
> -    return;
> -
> -  NamedDecl *PrevDecl = Previous.getFoundDecl();
> -
> -  // If there was a previous declaration of this entity, it may be in
> -  // our identifier chain. Update the identifier chain with the new
> -  // declaration.
> -  if (S && IdResolver.ReplaceDecl(PrevDecl, ND)) {
> -    // The previous declaration was found on the identifer resolver
> -    // chain, so remove it from its scope.
> -
> -    if (S->isDeclScope(PrevDecl)) {
> -      // Special case for redeclarations in the SAME scope.
> -      // Because this declaration is going to be added to the identifier chain
> -      // later, we should temporarily take it OFF the chain.
> -      IdResolver.RemoveDecl(ND);
> -
> -    } else {
> -      // Find the scope for the original declaration.
> -      while (S && !S->isDeclScope(PrevDecl))
> -        S = S->getParent();
> -    }
> -
> -    if (S)
> -      S->RemoveDecl(PrevDecl);
> -  }
> }
> 
> llvm::DenseMap<DeclarationName, NamedDecl *>::iterator
> 
> Modified: cfe/trunk/test/Sema/extern-redecl.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/extern-redecl.c?rev=179430&r1=179429&r2=179430&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/extern-redecl.c (original)
> +++ cfe/trunk/test/Sema/extern-redecl.c Fri Apr 12 19:20:21 2013
> @@ -33,3 +33,12 @@ void test3declarer() {
>   extern int test3_array[];
>   int x = sizeof(test3_array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}}
> }
> +
> +void test4() {
> +  extern int test4_array[];
> +  {
> +    extern int test4_array[100];
> +    int x = sizeof(test4_array); // fine
> +  }
> +  int x = sizeof(test4_array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}}
> +}
> 
> Modified: cfe/trunk/test/Sema/function-redecl.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/function-redecl.c?rev=179430&r1=179429&r2=179430&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/function-redecl.c (original)
> +++ cfe/trunk/test/Sema/function-redecl.c Fri Apr 12 19:20:21 2013
> @@ -62,7 +62,7 @@ void test2() {
> // <rdar://problem/6127293>
> int outer1(int); // expected-note{{previous declaration is here}}
> struct outer3 { };
> -int outer4(int);
> +int outer4(int); // expected-note{{previous declaration is here}}
> int outer5; // expected-note{{previous definition is here}}
> int *outer7(int);
> 
> @@ -70,7 +70,7 @@ void outer_test() {
>   int outer1(float); // expected-error{{conflicting types for 'outer1'}}
>   int outer2(int); // expected-note{{previous declaration is here}}
>   int outer3(int); // expected-note{{previous declaration is here}}
> -  int outer4(int); // expected-note{{previous declaration is here}}
> +  int outer4(int);
>   int outer5(int); // expected-error{{redefinition of 'outer5' as different kind of symbol}}
>   int* outer6(int); // expected-note{{previous declaration is here}}
>   int *outer7(int);
> 
> Modified: cfe/trunk/test/Sema/var-redecl.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/var-redecl.c?rev=179430&r1=179429&r2=179430&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/var-redecl.c (original)
> +++ cfe/trunk/test/Sema/var-redecl.c Fri Apr 12 19:20:21 2013
> @@ -4,7 +4,7 @@ int outer1; // expected-note{{previous d
> extern int outer2; // expected-note{{previous definition is here}}
> int outer4;
> int outer4; // expected-note{{previous definition is here}}
> -int outer5;
> +int outer5; // expected-note{{previous definition is here}}
> int outer6(float); // expected-note{{previous definition is here}}
> int outer7(float);
> 
> @@ -13,7 +13,7 @@ void outer_test() {
>   extern float outer2; // expected-error{{redefinition of 'outer2' with a different type}}
>   extern float outer3; // expected-note{{previous definition is here}}
>   double outer4;
> -  extern int outer5; // expected-note{{previous definition is here}}
> +  extern int outer5;
>   extern int outer6; // expected-error{{redefinition of 'outer6' as different kind of symbol}}
>   int outer7;
>   extern int outer8; // expected-note{{previous definition is here}}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list