This is also a candidate for the 3.6 release branch as it fixes another post-3.5 diagnostics regression.
On Tue, Jan 27, 2015 at 10:26 AM, Kaelyn Takata <[email protected]> wrote: > Author: rikka > Date: Tue Jan 27 12:26:18 2015 > New Revision: 227220 > > URL: http://llvm.org/viewvc/llvm-project?rev=227220&view=rev > Log: > Properly handle typos in the conditional of ?: expressions in C. > > In particular, remove the OpaqueExpr transformation from r225389 and > move the correction of the conditional from CheckConditionalOperands to > ActOnConditionalOp before the OpaqueExpr is created. This fixes the > typo correction behavior in C code that uses the GNU extension for a > binary ?: (without an expression between the "?" and the ":"). > > Modified: > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/lib/Sema/SemaExprCXX.cpp > cfe/trunk/test/Sema/typo-correction.c > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=227220&r1=227219&r2=227220&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 27 12:26:18 2015 > @@ -5785,15 +5785,6 @@ QualType Sema::CheckConditionalOperands( > ExprObjectKind &OK, > SourceLocation QuestionLoc) { > > - if (!getLangOpts().CPlusPlus) { > - // C cannot handle TypoExpr nodes on either side of a binop because it > - // doesn't handle dependent types properly, so make sure any > TypoExprs have > - // been dealt with before checking the operands. > - ExprResult CondResult = CorrectDelayedTyposInExpr(Cond); > - if (!CondResult.isUsable()) return QualType(); > - Cond = CondResult; > - } > - > ExprResult LHSResult = CheckPlaceholderExpr(LHS.get()); > if (!LHSResult.isUsable()) return QualType(); > LHS = LHSResult; > @@ -6175,6 +6166,15 @@ ExprResult Sema::ActOnConditionalOp(Sour > SourceLocation ColonLoc, > Expr *CondExpr, Expr *LHSExpr, > Expr *RHSExpr) { > + if (!getLangOpts().CPlusPlus) { > + // C cannot handle TypoExpr nodes in the condition because it > + // doesn't handle dependent types properly, so make sure any > TypoExprs have > + // been dealt with before checking the operands. > + ExprResult CondResult = CorrectDelayedTyposInExpr(CondExpr); > + if (!CondResult.isUsable()) return ExprError(); > + CondExpr = CondResult.get(); > + } > + > // If this is the gnu "x ?: y" extension, analyze the types as though > the LHS > // was the condition. > OpaqueValueExpr *opaqueValue = nullptr; > > Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=227220&r1=227219&r2=227220&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Jan 27 12:26:18 2015 > @@ -6146,12 +6146,6 @@ public: > > ExprResult TransformLambdaExpr(LambdaExpr *E) { return Owned(E); } > > - ExprResult TransformOpaqueValueExpr(OpaqueValueExpr *E) { > - if (Expr *SE = E->getSourceExpr()) > - return TransformExpr(SE); > - return BaseTransform::TransformOpaqueValueExpr(E); > - } > - > ExprResult Transform(Expr *E) { > ExprResult Res; > while (true) { > > Modified: cfe/trunk/test/Sema/typo-correction.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/typo-correction.c?rev=227220&r1=227219&r2=227220&view=diff > > ============================================================================== > --- cfe/trunk/test/Sema/typo-correction.c (original) > +++ cfe/trunk/test/Sema/typo-correction.c Tue Jan 27 12:26:18 2015 > @@ -13,6 +13,11 @@ void PR21656() { > a = b ? : 0; // expected-warning {{type specifier missing, defaults to > 'int'}} \ > // expected-error {{use of undeclared identifier 'b'}} > > +int foobar; // expected-note {{'foobar' declared here}} > +a = goobar ?: 4; // expected-warning {{type specifier missing, defaults > to 'int'}} \ > + // expected-error {{use of undeclared identifier > 'goobar'; did you mean 'foobar'?}} \ > + // expected-error {{initializer element is not a > compile-time constant}} > + > struct ContainerStuct { > enum { SOME_ENUM }; // expected-note {{'SOME_ENUM' declared here}} > }; > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
