diff options
-rw-r--r-- | Driver/RewriteTest.cpp | 3 | ||||
-rw-r--r-- | Parse/ParseObjc.cpp | 23 | ||||
-rw-r--r-- | Sema/Sema.h | 5 | ||||
-rw-r--r-- | Sema/SemaDecl.cpp | 8 | ||||
-rw-r--r-- | include/clang/Parse/Action.h | 3 | ||||
-rw-r--r-- | include/clang/Parse/Parser.h | 2 |
6 files changed, 28 insertions, 16 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index 257a060ba9..999b0796a9 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -555,8 +555,7 @@ void RewriteTest::SynthesizeObjcInternalStruct(ObjcInterfaceDecl *CDecl, int NumIvars = CDecl->getIntfDeclNumIvars(); // If no ivars and no root or if its root, directly or indirectly, - // have no ivars (thus not synthesize) - // then no need to synthesize this class either. + // have no ivars (thus not synthesized) then no need to synthesize this class. if (NumIvars <= 0 && (!RCDecl || !ObjcSynthesizedStructs.count(RCDecl))) return; diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 301b04148a..69124f2939 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -471,14 +471,13 @@ bool Parser::isObjCPropertyAttribute() { /// objc-type-qualifier /// objc-type-qualifiers objc-type-qualifier /// -Parser::TypeTy *Parser::ParseObjCTypeName() { +Parser::TypeTy *Parser::ParseObjCTypeName(ObjcDeclSpec &DS) { assert(Tok.is(tok::l_paren) && "expected ("); SourceLocation LParenLoc = ConsumeParen(), RParenLoc; TypeTy *Ty = 0; // Parse type qualifiers, in, inout, etc. - ObjcDeclSpec DS; ParseObjcTypeQualifierList(DS); if (isTypeSpecifierQualifier()) { @@ -528,8 +527,9 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, { // Parse the return type. TypeTy *ReturnType = 0; + ObjcDeclSpec DSRet; if (Tok.is(tok::l_paren)) - ReturnType = ParseObjCTypeName(); + ReturnType = ParseObjCTypeName(DSRet); SourceLocation selLoc; IdentifierInfo *SelIdent = ParseObjCSelector(selLoc); if (Tok.isNot(tok::colon)) { @@ -546,12 +546,13 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Selector Sel = PP.getSelectorTable().getNullarySelector(SelIdent); return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(), - mType, ReturnType, Sel, - 0, 0, MethodAttrs, MethodImplKind); + mType, DSRet, ReturnType, Sel, + 0, 0, 0, MethodAttrs, MethodImplKind); } llvm::SmallVector<IdentifierInfo *, 12> KeyIdents; llvm::SmallVector<Action::TypeTy *, 12> KeyTypes; + llvm::SmallVector<ObjcDeclSpec, 12> ArgTypeQuals; llvm::SmallVector<IdentifierInfo *, 12> ArgNames; Action::TypeTy *TypeInfo; @@ -564,11 +565,14 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, break; } ConsumeToken(); // Eat the ':'. - if (Tok.is(tok::l_paren)) // Parse the argument type. - TypeInfo = ParseObjCTypeName(); + ObjcDeclSpec DSType; + if (Tok.is(tok::l_paren)) { // Parse the argument type. + TypeInfo = ParseObjCTypeName(DSType); + } else TypeInfo = 0; KeyTypes.push_back(TypeInfo); + ArgTypeQuals.push_back(DSType); // If attributes exist before the argument name, parse them. if (getLang().ObjC2 && Tok.is(tok::kw___attribute)) @@ -613,8 +617,9 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, Selector Sel = PP.getSelectorTable().getSelector(KeyIdents.size(), &KeyIdents[0]); return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(), - mType, ReturnType, Sel, - &KeyTypes[0], &ArgNames[0], + mType, DSRet, ReturnType, Sel, + &ArgTypeQuals[0], &KeyTypes[0], + &ArgNames[0], MethodAttrs, MethodImplKind); } diff --git a/Sema/Sema.h b/Sema/Sema.h index 32ab40d71f..0df8644178 100644 --- a/Sema/Sema.h +++ b/Sema/Sema.h @@ -524,10 +524,11 @@ public: virtual DeclTy *ActOnMethodDeclaration( SourceLocation BeginLoc, // location of the + or -. SourceLocation EndLoc, // location of the ; or {. - tok::TokenKind MethodType, TypeTy *ReturnType, Selector Sel, + tok::TokenKind MethodType, ObjcDeclSpec &ReturnQT, TypeTy *ReturnType, + Selector Sel, // optional arguments. The number of types/arguments is obtained // from the Sel.getNumArgs(). - TypeTy **ArgTypes, IdentifierInfo **ArgNames, + ObjcDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames, AttributeList *AttrList, tok::ObjCKeywordKind MethodImplKind); // ActOnClassMessage - used for both unary and keyword messages. diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index 66ece4149a..0d993b8fcc 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -1288,6 +1288,9 @@ void Sema::CheckImplementationIvars(ObjcImplementationDecl *ImpDecl, IDecl->addInstanceVariablesToClass(ivars, numIvars, RBrace); return; } + // If implementation has empty ivar list, just return. + if (numIvars == 0) + return; assert(ivars && "missing @implementation ivars"); @@ -1967,10 +1970,11 @@ void Sema::ActOnAddMethodsToObjcDecl(Scope* S, DeclTy *classDecl, Sema::DeclTy *Sema::ActOnMethodDeclaration( SourceLocation MethodLoc, SourceLocation EndLoc, - tok::TokenKind MethodType, TypeTy *ReturnType, Selector Sel, + tok::TokenKind MethodType, ObjcDeclSpec &ReturnQT, TypeTy *ReturnType, + Selector Sel, // optional arguments. The number of types/arguments is obtained // from the Sel.getNumArgs(). - TypeTy **ArgTypes, IdentifierInfo **ArgNames, + ObjcDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames, AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind) { llvm::SmallVector<ParmVarDecl*, 16> Params; diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index 32025eaa01..0be53afda8 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -21,6 +21,7 @@ namespace clang { // Semantic. class DeclSpec; + class ObjcDeclSpec; class Declarator; class AttributeList; // Parse. @@ -529,8 +530,10 @@ public: SourceLocation BeginLoc, // location of the + or -. SourceLocation EndLoc, // location of the ; or {. tok::TokenKind MethodType, // tok::minus for instance, tok::plus for class. + ObjcDeclSpec &ReturnQT, // for return type's in inout etc. TypeTy *ReturnType, // the method return type. Selector Sel, // a unique name for the method. + ObjcDeclSpec *ArgQT, // for arguments' in inout etc. TypeTy **ArgTypes, // non-zero when Sel.getNumArgs() > 0 IdentifierInfo **ArgNames, // non-zero when Sel.getNumArgs() > 0 AttributeList *AttrList, // optional diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 0a5295cedb..1345fe99dd 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -293,7 +293,7 @@ private: IdentifierInfo *ObjcPropertyAttrs[objc_NumAttrs]; bool isObjCPropertyAttribute(); - TypeTy *ParseObjCTypeName(); + TypeTy *ParseObjCTypeName(ObjcDeclSpec &DS); void ParseObjCMethodRequirement(); DeclTy *ParseObjCMethodPrototype(DeclTy *classOrCat, tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword); |