aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDeclObjC.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-11-04 16:57:32 +0000
committerAnders Carlsson <andersca@mac.com>2008-11-04 16:57:32 +0000
commit15281450f512b7d554858e4d17fca00bfc442a07 (patch)
treee828319651d780bf40c5dbdce3169d295790c2aa /lib/Sema/SemaDeclObjC.cpp
parent21ef7ae45c8b91f23cf5eab2263421bb398a644b (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.cpp44
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;
+}