r227220 - Properly handle typos in the conditional of ?: expressions in C.

Kaelyn Takata rikka at google.com
Tue Jan 27 10:42:22 PST 2015


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 <rikka at google.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150127/4712c21f/attachment.html>


More information about the cfe-commits mailing list