Richard Smith 1c34fb78e7 Fix implementation of C11 6.2.7/4 and C++11 [dcl.array]p3:
When a local extern declaration redeclares some other entity, the type of that
entity is merged with the prior type if the prior declaration is visible (in C)
or is declared in the same scope (in C++).

 - Make LookupRedeclarationWithLinkage actually work in C++, use it in the right
   set of cases, and make it track whether it found a shadowed declaration.
 - Track whether we found a declaration in the same scope (for C++) including
   across serialization and template instantiation.

llvm-svn: 188307
2013-08-13 18:18:50 +00:00

45 lines
1.5 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1y %s
// expected-no-diagnostics
// C++11 [basic.link]p6:
// The name of a function declared in block scope and the name
// of a variable declared by a block scope extern declaration
// have linkage. If there is a visible declaration of an entity
// with linkage having the same name and type, ignoring entities
// declared outside the innermost enclosing namespace scope, the
// block scope declaration declares that same entity and
// receives the linkage of the previous declaration.
extern int same_entity;
constexpr int *get1() {
int same_entity = 0; // not the same entity
{
extern int same_entity;
return &same_entity;
}
}
static_assert(get1() == &same_entity, "failed to find previous decl");
static int same_entity_2[3];
constexpr int *get2() {
// This is a redeclaration of the same entity, even though it doesn't
// inherit the type of the prior declaration.
extern int same_entity_2[];
return same_entity_2;
}
static_assert(get2() == same_entity_2, "failed to find previous decl");
static int different_entities;
constexpr int *get3() {
int different_entities = 0;
{
// FIXME: This is not a redeclaration of the prior entity, because
// it is not visible here. Under DR426, this is ill-formed, and without
// it, the static_assert below should fail.
extern int different_entities;
return &different_entities;
}
}
static_assert(get3() == &different_entities, "failed to find previous decl");