diff options
author | Anders Carlsson <andersca@mac.com> | 2008-11-04 16:57:32 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-11-04 16:57:32 +0000 |
commit | 15281450f512b7d554858e4d17fca00bfc442a07 (patch) | |
tree | e828319651d780bf40c5dbdce3169d295790c2aa /lib/Sema/SemaDeclObjC.cpp | |
parent | 21ef7ae45c8b91f23cf5eab2263421bb398a644b (diff) |
Make it an error if an Objective-C declaration is not in the global scope.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 3ccea6e082..6c17d5f1f6 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -124,6 +124,8 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc, IDecl->addReferencedProtocols((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs); IDecl->setLocEnd(EndProtoLoc); } + + CheckObjCDeclScope(IDecl); return IDecl; } @@ -163,7 +165,10 @@ Sema::DeclTy *Sema::ActOnCompatiblityAlias(SourceLocation AtLoc, ObjCCompatibleAliasDecl::Create(Context, AtLoc, AliasName, CDecl); ObjCAliasDecls[AliasName] = AliasDecl; - TUScope->AddDecl(AliasDecl); + + if (!CheckObjCDeclScope(AliasDecl)) + TUScope->AddDecl(AliasDecl); + return AliasDecl; } @@ -201,6 +206,8 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc, PDecl->addReferencedProtocols((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs); PDecl->setLocEnd(EndProtoLoc); } + + CheckObjCDeclScope(PDecl); return PDecl; } @@ -370,8 +377,13 @@ Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc, Protocols.push_back(PDecl); } - return ObjCForwardProtocolDecl::Create(Context, AtProtocolLoc, - &Protocols[0], Protocols.size()); + + ObjCForwardProtocolDecl *PDecl = + ObjCForwardProtocolDecl::Create(Context, AtProtocolLoc, + &Protocols[0], Protocols.size()); + + CheckObjCDeclScope(PDecl); + return PDecl; } Sema::DeclTy *Sema:: @@ -410,6 +422,8 @@ ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc, CDecl->addReferencedProtocols((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs); CDecl->setLocEnd(EndProtoLoc); } + + CheckObjCDeclScope(CDecl); return CDecl; } @@ -430,6 +444,8 @@ Sema::DeclTy *Sema::ActOnStartCategoryImplementation( /// TODO: Check that CatName, category name, is not used in another // implementation. ObjCCategoryImpls.push_back(CDecl); + + CheckObjCDeclScope(CDecl); return CDecl; } @@ -498,6 +514,9 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation( ObjCImplementationDecl::Create(Context, AtClassImplLoc, ClassName, IDecl, SDecl); + if (CheckObjCDeclScope(IMPDecl)) + return IMPDecl; + // Check that there is no duplicate implementation of this class. if (ObjCImplementations[ClassName]) // FIXME: Don't leak everything! @@ -730,8 +749,12 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, Interfaces.push_back(IDecl); } - return ObjCClassDecl::Create(Context, AtClassLoc, - &Interfaces[0], Interfaces.size()); + ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, AtClassLoc, + &Interfaces[0], + Interfaces.size()); + + CheckObjCDeclScope(CDecl); + return CDecl; } @@ -1327,3 +1350,14 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc, return PIDecl; } + +bool Sema::CheckObjCDeclScope(Decl *D) +{ + if (isa<TranslationUnitDecl>(CurContext)) + return false; + + Diag(D->getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope); + D->setInvalidDecl(); + + return true; +} |