r294008 - [Sema][ObjC++] Typo correction should handle ivars and properties
Alex L via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 3 06:37:39 PST 2017
Hi Hans,
Is there any chance we can merge this for 4.0? It fixed a nasty bug where
clang didn't catch invalid ObjC++ code during semantic analysis which led
to invalid object files or crashes in CodeGen.
Cheers,
Alex
On 3 February 2017 at 14:22, Alex Lorenz via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: arphaman
> Date: Fri Feb 3 08:22:33 2017
> New Revision: 294008
>
> URL: http://llvm.org/viewvc/llvm-project?rev=294008&view=rev
> Log:
> [Sema][ObjC++] Typo correction should handle ivars and properties
>
> After r260016 and r260017 disabled typo correction for ivars and properties
> clang didn't report errors about unresolved identifier in the base of ivar
> and
> property ref expressions. This meant that clang invoked CodeGen on invalid
> AST
> which then caused a crash.
>
> This commit re-enables typo correction for ivars and properites, and fixes
> the
> PR25113 & PR26486 (that were originally fixed in r260017 and r260016) in a
> different manner by transforming the Objective-C ivar reference expression
> with
> 'IsFreeIvar' preserved.
>
> rdar://30310772
>
> Modified:
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> cfe/trunk/lib/Sema/TreeTransform.h
> cfe/trunk/test/SemaObjCXX/typo-correction.mm
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaExprCXX.cpp?rev=294008&r1=294007&r2=294008&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Fri Feb 3 08:22:33 2017
> @@ -7250,14 +7250,6 @@ public:
>
> ExprResult TransformBlockExpr(BlockExpr *E) { return Owned(E); }
>
> - ExprResult TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
> - return Owned(E);
> - }
> -
> - ExprResult TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
> - return Owned(E);
> - }
> -
> ExprResult Transform(Expr *E) {
> ExprResult Res;
> while (true) {
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> TreeTransform.h?rev=294008&r1=294007&r2=294008&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Feb 3 08:22:33 2017
> @@ -2982,16 +2982,17 @@ public:
> ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
> SourceLocation IvarLoc,
> bool IsArrow, bool IsFreeIvar) {
> - // FIXME: We lose track of the IsFreeIvar bit.
> CXXScopeSpec SS;
> DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
> - return getSema().BuildMemberReferenceExpr(BaseArg,
> BaseArg->getType(),
> - /*FIXME:*/IvarLoc, IsArrow,
> - SS, SourceLocation(),
> - /*FirstQualifierInScope=*/
> nullptr,
> - NameInfo,
> - /*TemplateArgs=*/nullptr,
> - /*S=*/nullptr);
> + ExprResult Result = getSema().BuildMemberReferenceExpr(
> + BaseArg, BaseArg->getType(),
> + /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
> + /*FirstQualifierInScope=*/nullptr, NameInfo,
> + /*TemplateArgs=*/nullptr,
> + /*S=*/nullptr);
> + if (IsFreeIvar && Result.isUsable())
> + cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
> + return Result;
> }
>
> /// \brief Build a new Objective-C property reference expression.
>
> Modified: cfe/trunk/test/SemaObjCXX/typo-correction.mm
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaObjCXX/typo-correction.mm?rev=294008&r1=294007&r2=294008&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaObjCXX/typo-correction.mm (original)
> +++ cfe/trunk/test/SemaObjCXX/typo-correction.mm Fri Feb 3 08:22:33 2017
> @@ -21,3 +21,18 @@ public:
> self.m_prop2 = new ClassB(m_prop1); // expected-error {{use of
> undeclared identifier 'm_prop1'; did you mean '_m_prop1'?}}
> }
> @end
> +
> +// rdar://30310772
> +
> + at interface InvalidNameInIvarAndPropertyBase
> +{
> + at public
> + float _a;
> +}
> + at property float _b;
> + at end
> +
> +void invalidNameInIvarAndPropertyBase() {
> + float a = ((InvalidNameInIvarAndPropertyBase*)node)->_a; //
> expected-error {{use of undeclared identifier 'node'}}
> + float b = ((InvalidNameInIvarAndPropertyBase*)node)._b; //
> expected-error {{use of undeclared identifier 'node'}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170203/ed8d4518/attachment.html>
More information about the cfe-commits
mailing list