[PATCH] PR23923: "redefine_extname" pragma handled incorrectly in case of a local var with the same name

Aaron Ballman aaron.ballman at gmail.com
Wed Jun 24 09:07:33 PDT 2015


On Wed, Jun 24, 2015 at 10:54 AM, Andrey Bokhanko
<andreybokhanko at gmail.com> wrote:
> Patch updated in response to Aaron Ballman's comment (http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20150622/131626.html).
>
> Aaron, everything fixed according to your comments (including adding a new test).
>
>
> http://reviews.llvm.org/D10646
>
> Files:
>   lib/Sema/SemaDecl.cpp
>   test/CodeGen/redefine_extname.c
>   test/CodeGenCXX/redefine_extname.cpp
>
> Index: test/CodeGenCXX/redefine_extname.cpp
> ===================================================================
> --- test/CodeGenCXX/redefine_extname.cpp
> +++ test/CodeGenCXX/redefine_extname.cpp
> @@ -8,11 +8,21 @@
>    int statvfs64(struct statvfs64 *);
>  }
>
> -void foo() {
> +void some_func() {
>    struct statvfs64 st;
>    statvfs64(&st);
>  // Check that even if there is a structure with redefined name before the
>  // pragma, subsequent function name redefined properly. PR5172, Comment 11.
>  // CHECK:  call i32 @statvfs(%struct.statvfs64* %st)
>  }
>
> +// This is a case when redefenition is deferred *and* we have a local of the
> +// same name. PR23923.
> +#pragma redefine_extname foo bar
> +int f() {
> +  int foo = 0;
> +  return foo;
> +}
> +extern int foo() { return 1; }
> +// CHECK: define i32 @bar()

This is not testing what I was hoping to test. I wanted to know if a
declaration of foo() in an extern "C" language linkage block is
handled correctly. Instead, try:

extern "C" {
  int foo() { return 1; }
}

And then (I presume), CHECK: define i32 @bar()

Other changes look good though.

Thank you!

~Aaron

> +
> Index: test/CodeGen/redefine_extname.c
> ===================================================================
> --- test/CodeGen/redefine_extname.c
> +++ test/CodeGen/redefine_extname.c
> @@ -13,3 +13,14 @@
>  // CHECK:   call i32 @real()
>  // Check that this also works with variables names
>  // CHECK:   load i32, i32* @alias
> +
> +// This is a case when redefenition is deferred *and* we have a local of the
> +// same name. PR23923.
> +#pragma redefine_extname foo bar
> +int f() {
> +  int foo = 0;
> +  return foo;
> +}
> +extern int foo() { return 1; }
> +// CHECK: define i32 @bar()
> +
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -5522,6 +5522,19 @@
>    return true;
>  }
>
> +/// \brief Returns true if given declaration is TU-scoped and externally
> +/// visible.
> +static bool isDeclTUScopedExternallyVisible(const Decl *D) {
> +  if (auto *FD = dyn_cast<FunctionDecl>(D))
> +    return (FD->getDeclContext()->isTranslationUnit() || FD->isExternC()) &&
> +           FD->hasExternalFormalLinkage();
> +  else if (auto *VD = dyn_cast<VarDecl>(D))
> +    return (VD->getDeclContext()->isTranslationUnit() || VD->isExternC()) &&
> +           VD->hasExternalFormalLinkage();
> +
> +  llvm_unreachable("Unknown type of decl!");
> +}
> +
>  NamedDecl *
>  Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
>                                TypeSourceInfo *TInfo, LookupResult &Previous,
> @@ -5946,7 +5959,8 @@
>
>      NewVD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0),
>                                                  Context, Label, 0));
> -  } else if (!ExtnameUndeclaredIdentifiers.empty()) {
> +  } else if (!ExtnameUndeclaredIdentifiers.empty() &&
> +             isDeclTUScopedExternallyVisible(NewVD)) {
>      llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
>        ExtnameUndeclaredIdentifiers.find(NewVD->getIdentifier());
>      if (I != ExtnameUndeclaredIdentifiers.end()) {
> @@ -7468,7 +7482,8 @@
>      StringLiteral *SE = cast<StringLiteral>(E);
>      NewFD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0), Context,
>                                                  SE->getString(), 0));
> -  } else if (!ExtnameUndeclaredIdentifiers.empty()) {
> +  } else if (!ExtnameUndeclaredIdentifiers.empty() &&
> +             isDeclTUScopedExternallyVisible(NewFD)) {
>      llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
>        ExtnameUndeclaredIdentifiers.find(NewFD->getIdentifier());
>      if (I != ExtnameUndeclaredIdentifiers.end()) {
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/



More information about the cfe-commits mailing list