clang 19.0.0git
TransARCAssign.cpp
Go to the documentation of this file.
1//===--- TransARCAssign.cpp - Transformations to ARC mode -----------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// makeAssignARCSafe:
10//
11// Add '__strong' where appropriate.
12//
13// for (id x in collection) {
14// x = 0;
15// }
16// ---->
17// for (__strong id x in collection) {
18// x = 0;
19// }
20//
21//===----------------------------------------------------------------------===//
22
23#include "Transforms.h"
24#include "Internals.h"
27
28using namespace clang;
29using namespace arcmt;
30using namespace trans;
31
32namespace {
33
34class ARCAssignChecker : public RecursiveASTVisitor<ARCAssignChecker> {
35 MigrationPass &Pass;
36 llvm::DenseSet<VarDecl *> ModifiedVars;
37
38public:
39 ARCAssignChecker(MigrationPass &pass) : Pass(pass) { }
40
41 bool VisitBinaryOperator(BinaryOperator *Exp) {
42 if (Exp->getType()->isDependentType())
43 return true;
44
45 Expr *E = Exp->getLHS();
46 SourceLocation OrigLoc = E->getExprLoc();
47 SourceLocation Loc = OrigLoc;
48 DeclRefExpr *declRef = dyn_cast<DeclRefExpr>(E->IgnoreParenCasts());
49 if (declRef && isa<VarDecl>(declRef->getDecl())) {
50 ASTContext &Ctx = Pass.Ctx;
52 if (IsLV != Expr::MLV_ConstQualified)
53 return true;
54 VarDecl *var = cast<VarDecl>(declRef->getDecl());
55 if (var->isARCPseudoStrong()) {
56 Transaction Trans(Pass.TA);
57 if (Pass.TA.clearDiagnostic(diag::err_typecheck_arr_assign_enumeration,
58 Exp->getOperatorLoc())) {
59 if (!ModifiedVars.count(var)) {
60 TypeLoc TLoc = var->getTypeSourceInfo()->getTypeLoc();
61 Pass.TA.insert(TLoc.getBeginLoc(), "__strong ");
62 ModifiedVars.insert(var);
63 }
64 }
65 }
66 }
67
68 return true;
69 }
70};
71
72} // anonymous namespace
73
75 ARCAssignChecker assignCheck(pass);
76 assignCheck.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
77}
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:182
TranslationUnitDecl * getTranslationUnitDecl() const
Definition: ASTContext.h:1073
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3840
Expr * getLHS() const
Definition: Expr.h:3889
SourceLocation getOperatorLoc() const
Definition: Expr.h:3881
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1260
ValueDecl * getDecl()
Definition: Expr.h:1328
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:799
This represents one expression.
Definition: Expr.h:110
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, does not have an incomplet...
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition: Expr.cpp:3064
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:277
isModifiableLvalueResult
Definition: Expr.h:297
@ MLV_ConstQualified
Definition: Expr.h:305
QualType getType() const
Definition: Expr.h:142
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
Encodes a location in the source.
Base wrapper for a particular "section" of type source info.
Definition: TypeLoc.h:59
SourceLocation getBeginLoc() const
Get the begin source location.
Definition: TypeLoc.cpp:192
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition: TypeLoc.h:256
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2443
Represents a variable declaration or definition.
Definition: Decl.h:918
bool isARCPseudoStrong() const
Determine whether this variable is an ARC pseudo-__strong variable.
Definition: Decl.h:1527
TransformActions & TA
Definition: Internals.h:152
void insert(SourceLocation loc, StringRef text)
bool clearDiagnostic(ArrayRef< unsigned > IDs, SourceRange range)
void makeAssignARCSafe(MigrationPass &pass)
The JSON file list parser is used to communicate input to InstallAPI.