r227251 - Fix a think-o in handling ambiguous corrections for a TypoExpr.

Hans Wennborg hans at chromium.org
Tue Jan 27 15:14:25 PST 2015


On Tue, Jan 27, 2015 at 2:39 PM, Kaelyn Takata <rikka at google.com> wrote:
> I'd like to nominate this for the release branch, as it fixes
> partially-incorrect and confusing typo-correction diagnostics that weren't
> an issue in 3.5.

Merged in r227266.

Thanks,
Hans


> On Tue, Jan 27, 2015 at 2:01 PM, Kaelyn Takata <rikka at google.com> wrote:
>>
>> Author: rikka
>> Date: Tue Jan 27 16:01:39 2015
>> New Revision: 227251
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=227251&view=rev
>> Log:
>> Fix a think-o in handling ambiguous corrections for a TypoExpr.
>>
>> Under certain circumstances, the identifier mentioned in the diagnostic
>> won't match the intended correction even though the replacement
>> expression and the note pointing to the decl are both correct.
>> Basically, the TreeTransform assumes the TypoExpr's Consumer points to
>> the correct TypoCorrection, but the handling of typos that appear to be
>> ambiguous from the point of view of TransformTypoExpr would cause that
>> assumption to be violated by altering the Consumer's correction stream.
>> This fix allows the Consumer's correction stream to be reset to the
>> right TypoCorrection after successfully resolving the percieved ambiguity.
>>
>> Included is a fix to suppress correcting the RHS of an assignment to the
>> LHS of that assignment for non-C++ code, to prevent a regression in
>> test/SemaObjC/provisional-ivar-lookup.m.
>>
>> This fixes PR22297.
>>
>> Modified:
>>     cfe/trunk/include/clang/Sema/SemaInternal.h
>>     cfe/trunk/lib/Sema/SemaExpr.cpp
>>     cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>     cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp
>>
>> Modified: cfe/trunk/include/clang/Sema/SemaInternal.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/SemaInternal.h?rev=227251&r1=227250&r2=227251&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Sema/SemaInternal.h (original)
>> +++ cfe/trunk/include/clang/Sema/SemaInternal.h Tue Jan 27 16:01:39 2015
>> @@ -101,7 +101,7 @@ public:
>>                           DeclContext *MemberContext,
>>                           bool EnteringContext)
>>        : Typo(TypoName.getName().getAsIdentifierInfo()),
>> CurrentTCIndex(0),
>> -        SemaRef(SemaRef), S(S),
>> +        SavedTCIndex(0), SemaRef(SemaRef), S(S),
>>          SS(SS ? llvm::make_unique<CXXScopeSpec>(*SS) : nullptr),
>>          CorrectionValidator(std::move(CCC)),
>> MemberContext(MemberContext),
>>          Result(SemaRef, TypoName, LookupKind),
>> @@ -187,6 +187,17 @@ public:
>>             CurrentTCIndex >= ValidatedCorrections.size();
>>    }
>>
>> +  /// \brief Save the current position in the correction stream
>> (overwriting any
>> +  /// previously saved position).
>> +  void saveCurrentPosition() {
>> +    SavedTCIndex = CurrentTCIndex;
>> +  }
>> +
>> +  /// \brief Restore the saved position in the correction stream.
>> +  void restoreSavedPosition() {
>> +    CurrentTCIndex = SavedTCIndex;
>> +  }
>> +
>>    ASTContext &getContext() const { return SemaRef.Context; }
>>    const LookupResult &getLookupResult() const { return Result; }
>>
>> @@ -267,6 +278,7 @@ private:
>>
>>    SmallVector<TypoCorrection, 4> ValidatedCorrections;
>>    size_t CurrentTCIndex;
>> +  size_t SavedTCIndex;
>>
>>    Sema &SemaRef;
>>    Scope *S;
>>
>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=227251&r1=227250&r2=227251&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 27 16:01:39 2015
>> @@ -9459,6 +9459,18 @@ static void checkObjCPointerIntrospectio
>>    }
>>  }
>>
>> +static NamedDecl *getDeclFromExpr(Expr *E) {
>> +  if (!E)
>> +    return nullptr;
>> +  if (auto *DRE = dyn_cast<DeclRefExpr>(E))
>> +    return DRE->getDecl();
>> +  if (auto *ME = dyn_cast<MemberExpr>(E))
>> +    return ME->getMemberDecl();
>> +  if (auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
>> +    return IRE->getDecl();
>> +  return nullptr;
>> +}
>> +
>>  /// CreateBuiltinBinOp - Creates a new built-in binary operation with
>>  /// operator @p Opc at location @c TokLoc. This routine only supports
>>  /// built-in operations; ActOnBinOp handles overloaded operators.
>> @@ -9496,7 +9508,13 @@ ExprResult Sema::CreateBuiltinBinOp(Sour
>>      // doesn't handle dependent types properly, so make sure any
>> TypoExprs have
>>      // been dealt with before checking the operands.
>>      LHS = CorrectDelayedTyposInExpr(LHSExpr);
>> -    RHS = CorrectDelayedTyposInExpr(RHSExpr);
>> +    RHS = CorrectDelayedTyposInExpr(RHSExpr, [Opc, LHS](Expr *E) {
>> +      if (Opc != BO_Assign)
>> +        return ExprResult(E);
>> +      // Avoid correcting the RHS to the same Expr as the LHS.
>> +      Decl *D = getDeclFromExpr(E);
>> +      return (D && D == getDeclFromExpr(LHS.get())) ? ExprError() : E;
>> +    });
>>      if (!LHS.isUsable() || !RHS.isUsable())
>>        return ExprError();
>>    }
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=227251&r1=227250&r2=227251&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Jan 27 16:01:39 2015
>> @@ -6165,15 +6165,18 @@ public:
>>      while (!AmbiguousTypoExprs.empty()) {
>>        auto TE  = AmbiguousTypoExprs.back();
>>        auto Cached = TransformCache[TE];
>> -      AmbiguousTypoExprs.pop_back();
>> +      auto &State = SemaRef.getTypoExprState(TE);
>> +      State.Consumer->saveCurrentPosition();
>>        TransformCache.erase(TE);
>>        if (!TryTransform(E).isInvalid()) {
>> -        SemaRef.getTypoExprState(TE).Consumer->resetCorrectionStream();
>> +        State.Consumer->resetCorrectionStream();
>>          TransformCache.erase(TE);
>>          Res = ExprError();
>>          break;
>> -      } else
>> -        TransformCache[TE] = Cached;
>> +      }
>> +      AmbiguousTypoExprs.remove(TE);
>> +      State.Consumer->restoreSavedPosition();
>> +      TransformCache[TE] = Cached;
>>      }
>>
>>      // Ensure that all of the TypoExprs within the current Expr have been
>> found.
>>
>> Modified: cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp?rev=227251&r1=227250&r2=227251&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp Tue Jan 27 16:01:39
>> 2015
>> @@ -175,3 +175,13 @@ namespace PR22250 {
>>  // expected-error at +1 {{expected ';' after top level declarator}}
>>  int getenv_s(size_t *y, char(&z)) {}
>>  }
>> +
>> +namespace PR22297 {
>> +double pow(double x, double y);
>> +struct TimeTicks {
>> +  static void Now();  // expected-note {{'Now' declared here}}
>> +};
>> +void f() {
>> +  TimeTicks::now();  // expected-error {{no member named 'now' in
>> 'PR22297::TimeTicks'; did you mean 'Now'?}}
>> +}
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>



More information about the cfe-commits mailing list