diff options
Diffstat (limited to 'lib/Parse/ParseObjc.cpp')
| -rw-r--r-- | lib/Parse/ParseObjc.cpp | 67 | 
1 files changed, 33 insertions, 34 deletions
| diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index db35a386c350..d321baf836bf 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -18,6 +18,7 @@  #include "clang/Sema/PrettyDeclStackTrace.h"  #include "clang/Sema/Scope.h"  #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringExtras.h"  using namespace clang; @@ -1031,7 +1032,6 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc,                              Scope::FunctionPrototypeScope|Scope::DeclScope);    AttributePool allParamAttrs(AttrFactory); -      while (1) {      ParsedAttributes paramAttrs(AttrFactory);      Sema::ObjCArgInfo ArgInfo; @@ -1102,6 +1102,14 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc,      SelIdent = ParseObjCSelectorPiece(selLoc);      if (!SelIdent && Tok.isNot(tok::colon))        break; +    if (!SelIdent) { +      SourceLocation ColonLoc = Tok.getLocation(); +      if (PP.getLocForEndOfToken(ArgInfo.NameLoc) == ColonLoc) { +        Diag(ArgInfo.NameLoc, diag::warn_missing_selector_name) << ArgInfo.Name; +        Diag(ArgInfo.NameLoc, diag::note_missing_selector_name) << ArgInfo.Name; +        Diag(ColonLoc, diag::note_force_empty_selector_name) << ArgInfo.Name; +      } +    }      // We have a selector or a colon, continue parsing.    } @@ -1806,7 +1814,7 @@ StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {      Diag(Tok, diag::err_expected_lbrace);      return StmtError();    } -  StmtVector CatchStmts(Actions); +  StmtVector CatchStmts;    StmtResult FinallyStmt;    ParseScope TryScope(this, Scope::DeclScope);    StmtResult TryBody(ParseCompoundStatementBody()); @@ -1894,7 +1902,7 @@ StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {    }    return Actions.ActOnObjCAtTryStmt(atLoc, TryBody.take(),  -                                    move_arg(CatchStmts), +                                    CatchStmts,                                      FinallyStmt.take());  } @@ -2061,13 +2069,13 @@ ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {      ExprResult Lit(Actions.ActOnNumericConstant(Tok));      if (Lit.isInvalid()) { -      return move(Lit); +      return Lit;      }      ConsumeToken(); // Consume the literal token.      Lit = Actions.ActOnUnaryOp(getCurScope(), OpLoc, Kind, Lit.take());      if (Lit.isInvalid()) -      return move(Lit); +      return Lit;      return ParsePostfixExpressionSuffix(               Actions.BuildObjCNumericLiteral(AtLoc, Lit.take())); @@ -2134,7 +2142,7 @@ ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {    }  } -/// \brirg Parse the receiver of an Objective-C++ message send. +/// \brief Parse the receiver of an Objective-C++ message send.  ///  /// This routine parses the receiver of a message send in  /// Objective-C++ either as a type or as an expression. Note that this @@ -2346,7 +2354,7 @@ ExprResult Parser::ParseObjCMessageExpression() {    ExprResult Res(ParseExpression());    if (Res.isInvalid()) {      SkipUntil(tok::r_square); -    return move(Res); +    return Res;    }    return ParseObjCMessageExpressionBody(LBracLoc, SourceLocation(), @@ -2418,7 +2426,7 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,    SmallVector<IdentifierInfo *, 12> KeyIdents;    SmallVector<SourceLocation, 12> KeyLocs; -  ExprVector KeyExprs(Actions); +  ExprVector KeyExprs;    if (Tok.is(tok::colon)) {      while (1) { @@ -2465,7 +2473,7 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,          // stop at the ']' when it skips to the ';'.  We want it to skip beyond          // the enclosing expression.          SkipUntil(tok::r_square); -        return move(Res); +        return Res;        }        // We have a valid expression. @@ -2512,7 +2520,7 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,          // stop at the ']' when it skips to the ';'.  We want it to skip beyond          // the enclosing expression.          SkipUntil(tok::r_square); -        return move(Res); +        return Res;        }        // We have a valid expression. @@ -2551,32 +2559,23 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,    if (SuperLoc.isValid())      return Actions.ActOnSuperMessage(getCurScope(), SuperLoc, Sel, -                                     LBracLoc, KeyLocs, RBracLoc, -                                     MultiExprArg(Actions,  -                                                  KeyExprs.take(), -                                                  KeyExprs.size())); +                                     LBracLoc, KeyLocs, RBracLoc, KeyExprs);    else if (ReceiverType)      return Actions.ActOnClassMessage(getCurScope(), ReceiverType, Sel, -                                     LBracLoc, KeyLocs, RBracLoc, -                                     MultiExprArg(Actions,  -                                                  KeyExprs.take(),  -                                                  KeyExprs.size())); +                                     LBracLoc, KeyLocs, RBracLoc, KeyExprs);    return Actions.ActOnInstanceMessage(getCurScope(), ReceiverExpr, Sel, -                                      LBracLoc, KeyLocs, RBracLoc, -                                      MultiExprArg(Actions,  -                                                   KeyExprs.take(),  -                                                   KeyExprs.size())); +                                      LBracLoc, KeyLocs, RBracLoc, KeyExprs);  }  ExprResult Parser::ParseObjCStringLiteral(SourceLocation AtLoc) {    ExprResult Res(ParseStringLiteralExpression()); -  if (Res.isInvalid()) return move(Res); +  if (Res.isInvalid()) return Res;    // @"foo" @"bar" is a valid concatenated string.  Eat any subsequent string    // expressions.  At this point, we know that the only valid thing that starts    // with '@' is an @"".    SmallVector<SourceLocation, 4> AtLocs; -  ExprVector AtStrings(Actions); +  ExprVector AtStrings;    AtLocs.push_back(AtLoc);    AtStrings.push_back(Res.release()); @@ -2589,12 +2588,12 @@ ExprResult Parser::ParseObjCStringLiteral(SourceLocation AtLoc) {      ExprResult Lit(ParseStringLiteralExpression());      if (Lit.isInvalid()) -      return move(Lit); +      return Lit;      AtStrings.push_back(Lit.release());    } -  return Owned(Actions.ParseObjCStringLiteral(&AtLocs[0], AtStrings.take(), +  return Owned(Actions.ParseObjCStringLiteral(&AtLocs[0], AtStrings.data(),                                                AtStrings.size()));  } @@ -2615,7 +2614,7 @@ ExprResult Parser::ParseObjCBooleanLiteral(SourceLocation AtLoc,  ExprResult Parser::ParseObjCCharacterLiteral(SourceLocation AtLoc) {    ExprResult Lit(Actions.ActOnCharacterConstant(Tok));    if (Lit.isInvalid()) { -    return move(Lit); +    return Lit;    }    ConsumeToken(); // Consume the literal token.    return Owned(Actions.BuildObjCNumericLiteral(AtLoc, Lit.take())); @@ -2629,7 +2628,7 @@ ExprResult Parser::ParseObjCCharacterLiteral(SourceLocation AtLoc) {  ExprResult Parser::ParseObjCNumericLiteral(SourceLocation AtLoc) {    ExprResult Lit(Actions.ActOnNumericConstant(Tok));    if (Lit.isInvalid()) { -    return move(Lit); +    return Lit;    }    ConsumeToken(); // Consume the literal token.    return Owned(Actions.BuildObjCNumericLiteral(AtLoc, Lit.take())); @@ -2661,7 +2660,7 @@ Parser::ParseObjCBoxedExpr(SourceLocation AtLoc) {  }  ExprResult Parser::ParseObjCArrayLiteral(SourceLocation AtLoc) { -  ExprVector ElementExprs(Actions);                   // array elements. +  ExprVector ElementExprs;                   // array elements.    ConsumeBracket(); // consume the l_square.    while (Tok.isNot(tok::r_square)) { @@ -2672,7 +2671,7 @@ ExprResult Parser::ParseObjCArrayLiteral(SourceLocation AtLoc) {        // stop at the ']' when it skips to the ';'.  We want it to skip beyond        // the enclosing expression.        SkipUntil(tok::r_square); -      return move(Res); +      return Res;      }          // Parse the ellipsis that indicates a pack expansion. @@ -2689,7 +2688,7 @@ ExprResult Parser::ParseObjCArrayLiteral(SourceLocation AtLoc) {       return ExprError(Diag(Tok, diag::err_expected_rsquare_or_comma));    }    SourceLocation EndLoc = ConsumeBracket(); // location of ']' -  MultiExprArg Args(Actions, ElementExprs.take(), ElementExprs.size()); +  MultiExprArg Args(ElementExprs);    return Owned(Actions.BuildObjCArrayLiteral(SourceRange(AtLoc, EndLoc), Args));  } @@ -2707,7 +2706,7 @@ ExprResult Parser::ParseObjCDictionaryLiteral(SourceLocation AtLoc) {          // stop at the '}' when it skips to the ';'.  We want it to skip beyond          // the enclosing expression.          SkipUntil(tok::r_brace); -        return move(KeyExpr); +        return KeyExpr;        }      } @@ -2723,7 +2722,7 @@ ExprResult Parser::ParseObjCDictionaryLiteral(SourceLocation AtLoc) {        // stop at the '}' when it skips to the ';'.  We want it to skip beyond        // the enclosing expression.        SkipUntil(tok::r_brace); -      return move(ValueExpr); +      return ValueExpr;      }      // Parse the ellipsis that designates this as a pack expansion. @@ -2752,7 +2751,7 @@ ExprResult Parser::ParseObjCDictionaryLiteral(SourceLocation AtLoc) {  }  ///    objc-encode-expression: -///      @encode ( type-name ) +///      \@encode ( type-name )  ExprResult  Parser::ParseObjCEncodeExpression(SourceLocation AtLoc) {    assert(Tok.isObjCAtKeyword(tok::objc_encode) && "Not an @encode expression!"); | 
