r197202 - [objc] If we don't know for sure what the designated initializers of the superclass are,
Argyrios Kyrtzidis
akyrtzi at gmail.com
Thu Dec 12 19:48:17 PST 2013
Author: akirtzidis
Date: Thu Dec 12 21:48:17 2013
New Revision: 197202
URL: http://llvm.org/viewvc/llvm-project?rev=197202&view=rev
Log:
[objc] If we don't know for sure what the designated initializers of the superclass are,
assume that a [super init..] inside a designated initializer also refers to a designated one
and do not warn.
Modified:
cfe/trunk/include/clang/AST/DeclObjC.h
cfe/trunk/lib/Sema/SemaExprObjC.cpp
cfe/trunk/test/SemaObjC/attr-designated-init.m
Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=197202&r1=197201&r2=197202&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Thu Dec 12 21:48:17 2013
@@ -767,6 +767,12 @@ public:
/// marked with the 'objc_designated_initializer' attribute.
bool hasDesignatedInitializers() const;
+ /// Returns true if this interface decl declares a designated initializer
+ /// or it inherites one from its super class.
+ bool declaresOrInheritsDesignatedInitializers() const {
+ return hasDesignatedInitializers() || inheritsDesignatedInitializers();
+ }
+
const ObjCProtocolList &getReferencedProtocols() const {
assert(hasDefinition() && "Caller did not check for forward reference!");
if (data().ExternallyCompleted)
Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=197202&r1=197201&r2=197202&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Thu Dec 12 21:48:17 2013
@@ -2455,7 +2455,10 @@ ExprResult Sema::BuildInstanceMessage(Ex
if (const ObjCObjectPointerType *
OCIType = ReceiverType->getAsObjCInterfacePointerType()) {
if (const ObjCInterfaceDecl *ID = OCIType->getInterfaceDecl()) {
- if (ID->isDesignatedInitializer(Sel)) {
+ // Either we know this is a designated initializer or we
+ // conservatively assume it because we don't know for sure.
+ if (!ID->declaresOrInheritsDesignatedInitializers() ||
+ ID->isDesignatedInitializer(Sel)) {
isDesignatedInitChain = true;
getCurFunction()->ObjCWarnForNoDesignatedInitChain = false;
}
Modified: cfe/trunk/test/SemaObjC/attr-designated-init.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-designated-init.m?rev=197202&r1=197201&r2=197202&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/attr-designated-init.m (original)
+++ cfe/trunk/test/SemaObjC/attr-designated-init.m Thu Dec 12 21:48:17 2013
@@ -203,3 +203,19 @@ __attribute__((objc_root_class))
return 0;
}
@end
+
+__attribute__((objc_root_class))
+ at interface B2
+-(id)init;
+ at end
+
+ at interface S8: B2
+-(id)initS8 NS_DESIGNATED_INITIALIZER;
+ at end
+
+ at implementation S8
+-(id)initS8
+{
+ return [super init];
+}
+ at end
More information about the cfe-commits
mailing list