r196644 - Add a SubsetSubject in Attr.td to automate checking of where the objc_designated_initializer
Argyrios Kyrtzidis
akyrtzi at gmail.com
Fri Dec 6 22:08:05 PST 2013
Author: akirtzidis
Date: Sat Dec 7 00:08:04 2013
New Revision: 196644
URL: http://llvm.org/viewvc/llvm-project?rev=196644&view=rev
Log:
Add a SubsetSubject in Attr.td to automate checking of where the objc_designated_initializer
attribute is acceptable.
Modified:
cfe/trunk/include/clang/Basic/Attr.td
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/include/clang/Sema/AttributeList.h
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
cfe/trunk/test/SemaObjC/attr-designated-init.m
Modified: cfe/trunk/include/clang/Basic/Attr.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=196644&r1=196643&r2=196644&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/Attr.td (original)
+++ cfe/trunk/include/clang/Basic/Attr.td Sat Dec 7 00:08:04 2013
@@ -40,6 +40,10 @@ def NonBitField : SubsetSubject<Field,
def ObjCInstanceMethod : SubsetSubject<ObjCMethod,
[{S->isInstanceMethod()}]>;
+def ObjCInterfaceDeclInitMethod : SubsetSubject<ObjCMethod,
+ [{S->getMethodFamily() == OMF_init &&
+ isa<ObjCInterfaceDecl>(S->getDeclContext())}]>;
+
def Struct : SubsetSubject<Record,
[{!S->isUnion()}]>;
@@ -699,7 +703,8 @@ def ObjCSuppressProtocol : InheritableAt
def ObjCDesignatedInitializer : Attr {
let Spellings = [GNU<"objc_designated_initializer">];
- let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
+ let Subjects = SubjectList<[ObjCInterfaceDeclInitMethod], ErrorDiag,
+ "ExpectedObjCInterfaceDeclInitMethod">;
}
def Overloadable : Attr {
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=196644&r1=196643&r2=196644&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat Dec 7 00:08:04 2013
@@ -2037,7 +2037,8 @@ def warn_attribute_wrong_decl_type : War
"variables and fields|variables, data members and tag types|"
"types and namespaces|Objective-C interfaces|methods and properties|"
"struct or union|struct, union or class|types|"
- "Objective-C instance methods|variables, functions and classes}1">,
+ "Objective-C instance methods|init methods of interface declarations|"
+ "variables, functions and classes}1">,
InGroup<IgnoredAttributes>;
def err_attribute_wrong_decl_type : Error<
"%0 attribute only applies to %select{functions|unions|"
@@ -2049,7 +2050,8 @@ def err_attribute_wrong_decl_type : Erro
"variables and fields|variables, data members and tag types|"
"types and namespaces|Objective-C interfaces|methods and properties|"
"struct or union|struct, union or class|types|"
- "Objective-C instance methods|variables, functions and classes}1">;
+ "Objective-C instance methods|init methods of interface declarations|"
+ "variables, functions and classes}1">;
def warn_type_attribute_wrong_type : Warning<
"'%0' only applies to %select{function|pointer|"
"Objective-C object or block pointer}1 types; type here is %2">,
@@ -2428,10 +2430,6 @@ def note_protocol_decl : Note<
"protocol is declared here">;
// objc_designated_initializer attribute diagnostics.
-def err_attr_objc_designated_not_init_family : Error<
- "'objc_designated_initializer' only applies to methods of the init family">;
-def err_attr_objc_designated_not_interface : Error<
- "'objc_designated_initializer' only applies to methods of interface declarations">;
def warn_objc_designated_init_missing_super_call : Warning<
"designated initializer missing a 'super' call to a designated initializer of the super class">,
InGroup<ObjCDesignatedInit>;
Modified: cfe/trunk/include/clang/Sema/AttributeList.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=196644&r1=196643&r2=196644&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/AttributeList.h (original)
+++ cfe/trunk/include/clang/Sema/AttributeList.h Sat Dec 7 00:08:04 2013
@@ -909,6 +909,7 @@ enum AttributeDeclKind {
ExpectedStructOrUnionOrClass,
ExpectedType,
ExpectedObjCInstanceMethod,
+ ExpectedObjCInterfaceDeclInitMethod,
ExpectedFunctionVariableOrClass
};
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=196644&r1=196643&r2=196644&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Sat Dec 7 00:08:04 2013
@@ -3733,24 +3733,9 @@ static void handleObjCBridgeRelatedAttr(
static void handleObjCDesignatedInitializer(Sema &S, Decl *D,
const AttributeList &Attr) {
- SourceLocation Loc = Attr.getLoc();
- ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
-
- if (Method->getMethodFamily() != OMF_init) {
- S.Diag(D->getLocStart(), diag::err_attr_objc_designated_not_init_family)
- << SourceRange(Loc, Loc);
- return;
- }
- ObjCInterfaceDecl *IFace =
- dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext());
- if (!IFace) {
- S.Diag(D->getLocStart(), diag::err_attr_objc_designated_not_interface)
- << SourceRange(Loc, Loc);
- return;
- }
-
+ ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D->getDeclContext());
IFace->setHasDesignatedInitializers();
- Method->addAttr(::new (S.Context)
+ D->addAttr(::new (S.Context)
ObjCDesignatedInitializerAttr(Attr.getRange(), S.Context,
Attr.getAttributeSpellingListIndex()));
}
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=196644&r1=196643&r2=196644&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/attr-designated-init.m (original)
+++ cfe/trunk/test/SemaObjC/attr-designated-init.m Sat Dec 7 00:08:04 2013
@@ -2,33 +2,33 @@
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
-void fnfoo(void) NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to methods}}
+void fnfoo(void) NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface declarations}}
@protocol P1
--(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to methods of interface declarations}}
+-(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface declarations}}
@end
__attribute__((objc_root_class))
@interface I1
--(void)meth NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to methods of the init family}}
+-(void)meth NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface declarations}}
-(id)init NS_DESIGNATED_INITIALIZER;
-+(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to methods of the init family}}
++(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface declarations}}
@end
@interface I1(cat)
--(id)init2 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to methods of interface declarations}}
+-(id)init2 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface declarations}}
@end
@interface I1()
--(id)init3 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to methods of interface declarations}}
+-(id)init3 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface declarations}}
@end
@implementation I1
-(void)meth {}
--(id)init NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to methods of interface declarations}}
+-(id)init NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to init methods of interface declarations}}
+(id)init { return 0; }
-(id)init3 { return 0; } // expected-warning {{secondary initializer missing a 'self' call to another initializer}}
--(id)init4 NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to methods of interface declarations}} \
+-(id)init4 NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to init methods of interface declarations}} \
// expected-warning {{secondary initializer missing a 'self' call to another initializer}}
@end
More information about the cfe-commits
mailing list