clang  9.0.0svn
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"
25 #include "clang/AST/ASTContext.h"
27 
28 using namespace clang;
29 using namespace arcmt;
30 using namespace trans;
31 
32 namespace {
33 
34 class ARCAssignChecker : public RecursiveASTVisitor<ARCAssignChecker> {
35  MigrationPass &Pass;
36  llvm::DenseSet<VarDecl *> ModifiedVars;
37 
38 public:
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.
isModifiableLvalueResult
Definition: Expr.h:271
Represents a variable declaration or definition.
Definition: Decl.h:812
void makeAssignARCSafe(MigrationPass &pass)
bool isARCPseudoStrong() const
Determine whether this variable is an ARC pseudo-__strong variable.
Definition: Decl.h:1359
Base wrapper for a particular "section" of type source info.
Definition: TypeLoc.h:56
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:154
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3313
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition: Expr.cpp:2728
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
bool clearDiagnostic(ArrayRef< unsigned > IDs, SourceRange range)
SourceLocation getBeginLoc() const
Get the begin source location.
Definition: TypeLoc.cpp:189
This represents one expression.
Definition: Expr.h:108
QualType getType() const
Definition: Expr.h:130
ValueDecl * getDecl()
Definition: Expr.h:1147
Encodes a location in the source.
SourceLocation getOperatorLoc() const
Definition: Expr.h:3345
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...
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:214
Expr * getLHS() const
Definition: Expr.h:3353
Dataflow Directional Tag Classes.
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:715
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition: TypeLoc.h:237
TranslationUnitDecl * getTranslationUnitDecl() const
Definition: ASTContext.h:1008
TransformActions & TA
Definition: Internals.h:150
void insert(SourceLocation loc, StringRef text)
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2086
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1074