зеркало из https://github.com/microsoft/clang-1.git
Several name lookup conflict detection fixes involving objective-c names.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43000 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
7e219e47de
Коммит
be127ba477
|
@ -945,6 +945,9 @@ Sema::DeclTy *Sema::ActOnStartClassInterface(
|
|||
// Chain & install the interface decl into the identifier.
|
||||
IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
|
||||
ClassName->setFETokenInfo(IDecl);
|
||||
|
||||
// Remember that this needs to be removed when the scope is popped.
|
||||
TUScope->AddDecl(IDecl);
|
||||
}
|
||||
|
||||
if (SuperName) {
|
||||
|
@ -1214,6 +1217,8 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation(
|
|||
IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
|
||||
ClassName->setFETokenInfo(IDecl);
|
||||
|
||||
// Remember that this needs to be removed when the scope is popped.
|
||||
TUScope->AddDecl(IDecl);
|
||||
}
|
||||
|
||||
// Check that there is no duplicate implementation of this class.
|
||||
|
@ -1397,9 +1402,16 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
|
|||
llvm::SmallVector<ObjcInterfaceDecl*, 32> Interfaces;
|
||||
|
||||
for (unsigned i = 0; i != NumElts; ++i) {
|
||||
ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(IdentList[i]);
|
||||
// Check for another declaration kind with the same name.
|
||||
ScopedDecl *PrevDecl = LookupInterfaceDecl(IdentList[i]);
|
||||
if (PrevDecl && !isa<ObjcInterfaceDecl>(PrevDecl)) {
|
||||
Diag(AtClassLoc, diag::err_redefinition_different_kind,
|
||||
IdentList[i]->getName());
|
||||
Diag(PrevDecl->getLocation(), diag::err_previous_definition);
|
||||
}
|
||||
ObjcInterfaceDecl *IDecl = dyn_cast_or_null<ObjcInterfaceDecl>(PrevDecl);
|
||||
if (!IDecl) { // Not already seen? Make a forward decl.
|
||||
IDecl = new ObjcInterfaceDecl(SourceLocation(), 0, IdentList[i], true);
|
||||
IDecl = new ObjcInterfaceDecl(AtClassLoc, 0, IdentList[i], true);
|
||||
// Chain & install the interface decl into the identifier.
|
||||
IDecl->setNext(IdentList[i]->getFETokenInfo<ScopedDecl>());
|
||||
IdentList[i]->setFETokenInfo(IDecl);
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
// RUN: clang -fsyntax-only -verify %s
|
||||
|
||||
@interface Foo // expected-error {{previous definition is here}}
|
||||
@end
|
||||
|
||||
float Foo; // expected-error {{redefinition of 'Foo' as different kind of symbol}}
|
||||
|
||||
@class Bar; // expected-error {{previous definition is here}}
|
||||
|
||||
typedef int Bar; // expected-error {{redefinition of 'Bar' as different kind of symbol}}
|
||||
|
||||
@implementation FooBar // expected-warning {{cannot find interface declaration for 'FooBar'}}
|
||||
@end
|
||||
|
||||
|
||||
typedef int OBJECT; // expected-error {{previous definition is here}}
|
||||
|
||||
@class OBJECT ; // expected-error {{redefinition of 'OBJECT' as different kind of symbol}}
|
||||
|
||||
|
||||
typedef int Gorf; // expected-error {{previous definition is here}}
|
||||
|
||||
@interface Gorf @end // expected-error {{redefinition of 'Gorf' as different kind of symbol}} \
|
||||
// expected-error {{previous definition is here}}
|
||||
|
||||
void Gorf() // expected-error {{redefinition of 'Gorf' as different kind of symbol}}
|
||||
{
|
||||
int Bar, Foo, FooBar;
|
||||
}
|
|
@ -8,13 +8,14 @@ typedef int INTF; // expected-error {{previous definition is here}}
|
|||
|
||||
@interface INTF @end // expected-error {{redefinition of 'INTF' as different kind of symbol}}
|
||||
|
||||
@interface OBJECT @end
|
||||
@interface OBJECT @end // expected-error {{previous definition is here}}
|
||||
|
||||
@interface INTF1 : OBJECT @end
|
||||
|
||||
@interface INTF1 : OBJECT @end // expected-error {{duplicate interface declaration for class 'INTF1'}
|
||||
|
||||
typedef int OBJECT; // expected-error {{previous definition is here}}
|
||||
typedef int OBJECT; // expected-error {{previous definition is here}} \
|
||||
expected-error {{redefinition of 'OBJECT' as different kind of symbol}}
|
||||
|
||||
@interface INTF2 : OBJECT @end // expected-error {{redefinition of 'OBJECT' as different kind of symbol}}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче