virtual void Destroy(ASTContext& C);
StorageClass getStorageClass() const { return (StorageClass)SClass; }
+ void setStorageClass(StorageClass SC) { SClass = SC; }
SourceLocation getTypeSpecStartLoc() const { return TypeSpecStartLoc; }
Diag(Old->getLocation(), diag::note_previous_definition);
return true;
}
- // C99 6.2.2p4: Check if we have a non-static decl followed by a static.
- if (New->getStorageClass() != VarDecl::Static &&
- Old->getStorageClass() == VarDecl::Static) {
+ // C99 6.2.2p4:
+ // For an identifier declared with the storage-class specifier
+ // extern in a scope in which a prior declaration of that
+ // identifier is visible,23) if the prior declaration specifies
+ // internal or external linkage, the linkage of the identifier at
+ // the later declaration is the same as the linkage specified at
+ // the prior declaration. If no prior declaration is visible, or
+ // if the prior declaration specifies no linkage, then the
+ // identifier has external linkage.
+ if ((New->hasExternalStorage() || New->getStorageClass() == VarDecl::None) &&
+ Old->hasLinkage())
+ /* Okay */;
+ else if (New->getStorageClass() != VarDecl::Static &&
+ Old->getStorageClass() == VarDecl::Static) {
Diag(New->getLocation(), diag::err_non_static_static) << New->getDeclName();
Diag(Old->getLocation(), diag::note_previous_definition);
return true;
static int i1; // expected-error{{static declaration of 'i1' follows non-static declaration}}
static int i2 = 5; // expected-note 1 {{previous definition is here}}
-int i2 = 3; // expected-error{{non-static declaration of 'i2' follows static declaration}}
+int i2 = 3; // expected-error{{redefinition of 'i2'}}
__private_extern__ int pExtern;
int pExtern = 0;