diff options
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 40 | ||||
-rw-r--r-- | test/FixIt/fixit-unrecoverable.cpp | 3 | ||||
-rw-r--r-- | test/Index/complete-recovery.m | 6 | ||||
-rw-r--r-- | test/SemaCXX/destructor.cpp | 5 | ||||
-rw-r--r-- | test/SemaCXX/elaborated-type-specifier.cpp | 3 | ||||
-rw-r--r-- | test/SemaObjC/crash-label.m | 2 | ||||
-rw-r--r-- | test/SemaTemplate/dependent-base-classes.cpp | 4 |
7 files changed, 32 insertions, 31 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 15c3e6ea0e..c3c4b4144a 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -177,8 +177,6 @@ static prec::Level getBinOpPrecedence(tok::TokenKind Kind, /// ExprResult Parser::ParseExpression() { ExprResult LHS(ParseAssignmentExpression()); - if (LHS.isInvalid()) return move(LHS); - return ParseRHSOfBinaryExpression(move(LHS), prec::Comma); } @@ -190,8 +188,6 @@ ExprResult Parser::ParseExpression() { ExprResult Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) { ExprResult LHS(ParseObjCAtExpression(AtLoc)); - if (LHS.isInvalid()) return move(LHS); - return ParseRHSOfBinaryExpression(move(LHS), prec::Comma); } @@ -206,14 +202,13 @@ Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) { ExtensionRAIIObject O(Diags); LHS = ParseCastExpression(false); - if (LHS.isInvalid()) return move(LHS); } - LHS = Actions.ActOnUnaryOp(getCurScope(), ExtLoc, tok::kw___extension__, - LHS.take()); - if (LHS.isInvalid()) return move(LHS); + if (!LHS.isInvalid()) + LHS = Actions.ActOnUnaryOp(getCurScope(), ExtLoc, tok::kw___extension__, + LHS.take()); - return ParseRHSOfBinaryExpression(LHS.take(), prec::Comma); + return ParseRHSOfBinaryExpression(move(LHS), prec::Comma); } /// ParseAssignmentExpression - Parse an expr that doesn't include commas. @@ -228,9 +223,7 @@ ExprResult Parser::ParseAssignmentExpression() { return ParseThrowExpression(); ExprResult LHS(ParseCastExpression(false)); - if (LHS.isInvalid()) return move(LHS); - - return ParseRHSOfBinaryExpression(LHS.take(), prec::Assignment); + return ParseRHSOfBinaryExpression(move(LHS), prec::Assignment); } /// ParseAssignmentExprWithObjCMessageExprStart - Parse an assignment expression @@ -251,8 +244,7 @@ Parser::ParseAssignmentExprWithObjCMessageExprStart(SourceLocation LBracLoc, ReceiverType, ReceiverExpr); if (R.isInvalid()) return move(R); R = ParsePostfixExpressionSuffix(R.take()); - if (R.isInvalid()) return move(R); - return ParseRHSOfBinaryExpression(R.take(), prec::Assignment); + return ParseRHSOfBinaryExpression(R, prec::Assignment); } @@ -264,9 +256,7 @@ ExprResult Parser::ParseConstantExpression() { Sema::Unevaluated); ExprResult LHS(ParseCastExpression(false)); - if (LHS.isInvalid()) return move(LHS); - - return ParseRHSOfBinaryExpression(LHS.take(), prec::Conditional); + return ParseRHSOfBinaryExpression(LHS, prec::Conditional); } /// ParseRHSOfBinaryExpression - Parse a binary expression that starts with @@ -362,9 +352,10 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) { RHS = ParseAssignmentExpression(); else RHS = ParseCastExpression(false); - if (RHS.isInvalid()) - return move(RHS); + if (RHS.isInvalid()) + LHS = ExprError(); + // Remember the precedence of this operator and get the precedence of the // operator immediately to the right of the RHS. prec::Level ThisPrec = NextTokPrec; @@ -384,10 +375,11 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) { // is okay, to bind exactly as tightly. For example, compile A=B=C=D as // A=(B=(C=D)), where each paren is a level of recursion here. // The function takes ownership of the RHS. - RHS = ParseRHSOfBinaryExpression(RHS.get(), + RHS = ParseRHSOfBinaryExpression(RHS, static_cast<prec::Level>(ThisPrec + !isRightAssoc)); + if (RHS.isInvalid()) - return move(RHS); + LHS = ExprError(); NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator, getLang().CPlusPlus0x); @@ -426,9 +418,9 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, ParsedType TypeOfCast) { bool NotCastExpr; ExprResult Res = ParseCastExpression(isUnaryExpression, - isAddressOfOperand, - NotCastExpr, - TypeOfCast); + isAddressOfOperand, + NotCastExpr, + TypeOfCast); if (NotCastExpr) Diag(Tok, diag::err_expected_expression); return move(Res); diff --git a/test/FixIt/fixit-unrecoverable.cpp b/test/FixIt/fixit-unrecoverable.cpp index 00ed8978c6..1e1f1b8db2 100644 --- a/test/FixIt/fixit-unrecoverable.cpp +++ b/test/FixIt/fixit-unrecoverable.cpp @@ -6,6 +6,7 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s float f(int y) { - return static_cst<float>(y); // expected-error{{use of undeclared identifier 'static_cst'; did you mean 'static_cast'?}} + return static_cst<float>(y); // expected-error{{use of undeclared identifier 'static_cst'; did you mean 'static_cast'?}} \ + // expected-error{{for function-style cast or type construction}} } diff --git a/test/Index/complete-recovery.m b/test/Index/complete-recovery.m index fbd92c794d..66084cdcec 100644 --- a/test/Index/complete-recovery.m +++ b/test/Index/complete-recovery.m @@ -7,7 +7,9 @@ @implementation A - (void)method:(int)x { A *a = [A method:1]; - blarg * blah = wibble + blarg * blah = wibble; + A *a2; + z = [a2 method:1]; } @end @@ -23,3 +25,5 @@ // CHECK-CC2: NotImplemented:{TypedText _Bool} // CHECK-CC2: VarDecl:{ResultType A *}{TypedText a} // CHECK-CC2: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )} +// RUN: c-index-test -code-completion-at=%s:12:11 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s +// CHECK-CC3: ObjCInstanceMethodDecl:{ResultType void}{TypedText method:}{Placeholder (int)} (17) diff --git a/test/SemaCXX/destructor.cpp b/test/SemaCXX/destructor.cpp index cdcae2e411..a33aa5e05e 100644 --- a/test/SemaCXX/destructor.cpp +++ b/test/SemaCXX/destructor.cpp @@ -67,7 +67,7 @@ struct Y { namespace PR6421 { class T; // expected-note{{forward declaration}} - class QGenericArgument + class QGenericArgument // expected-note{{declared here}} { template<typename U> void foo(T t) // expected-error{{variable has incomplete type}} @@ -76,7 +76,8 @@ namespace PR6421 { void disconnect() { T* t; - bob<QGenericArgument>(t); // expected-error{{undeclared identifier 'bob'}} + bob<QGenericArgument>(t); // expected-error{{undeclared identifier 'bob'}} \ + // expected-error{{does not refer to a value}} } }; } diff --git a/test/SemaCXX/elaborated-type-specifier.cpp b/test/SemaCXX/elaborated-type-specifier.cpp index 2d0b571e02..760079f3b0 100644 --- a/test/SemaCXX/elaborated-type-specifier.cpp +++ b/test/SemaCXX/elaborated-type-specifier.cpp @@ -35,7 +35,8 @@ namespace NS { } void test_S5_scope() { - S4 *s4; // expected-error{{use of undeclared identifier 'S4'}} + S4 *s4; // expected-error{{use of undeclared identifier 'S4'}} \ + // expected-error{{use of undeclared identifier 's4'}} } int test_funcparam_scope(struct S5 * s5) { diff --git a/test/SemaObjC/crash-label.m b/test/SemaObjC/crash-label.m index ffcb46344e..405d6bfd49 100644 --- a/test/SemaObjC/crash-label.m +++ b/test/SemaObjC/crash-label.m @@ -7,4 +7,4 @@ Exit: [nilArgs release]; // expected-error {{use of undeclared identifier}} - (NSDictionary *) _setupKernelStandardMode:(NSString *)source { // expected-error 2 {{expected a type}} \ expected-error {{missing context for method declaration}} \ expected-note{{to match this '{'}} - Exit: if(_ciKernel && !success ) { // expected-error {{use of undeclared identifier}} // expected-error 2 {{expected}} expected-note{{to match this '{'}} + Exit: if(_ciKernel && !success ) { // expected-error {{use of undeclared identifier}} // expected-error 2 {{expected}} expected-note{{to match this '{'}} expected-error{{use of undeclared identifier 'success'}} diff --git a/test/SemaTemplate/dependent-base-classes.cpp b/test/SemaTemplate/dependent-base-classes.cpp index e64d62301e..895eacc87e 100644 --- a/test/SemaTemplate/dependent-base-classes.cpp +++ b/test/SemaTemplate/dependent-base-classes.cpp @@ -105,7 +105,9 @@ namespace PR6081 { void f0(const X & k) { this->template f1<int>()(k); // expected-error{{'f1' following the 'template' keyword does not refer to a template}} \ - // FIXME: expected-error{{unqualified-id}} + // FIXME: expected-error{{unqualified-id}} \ + // expected-error{{function-style cast or type construction}} \ + // expected-error{{expected expression}} } }; } |