am b5d66e50: Merge "Fix invalid declaration of rsClearObject() iterator."
* commit 'b5d66e504968775698598a88107af253941800f8':
Fix invalid declaration of rsClearObject() iterator.
diff --git a/slang_rs_object_ref_count.cpp b/slang_rs_object_ref_count.cpp
index e8a5d2e..200b616 100644
--- a/slang_rs_object_ref_count.cpp
+++ b/slang_rs_object_ref_count.cpp
@@ -445,60 +445,64 @@
// Actually extract out the base RS object type for use later
BaseType = BaseType->getArrayElementTypeNoTypeQual();
- clang::Stmt *StmtArray[2] = {nullptr};
- int StmtCtr = 0;
-
if (NumArrayElements <= 0) {
return nullptr;
}
// Example destructor loop for "rs_font fontArr[10];"
//
- // (CompoundStmt
- // (DeclStmt "int rsIntIter")
- // (ForStmt
- // (BinaryOperator 'int' '='
- // (DeclRefExpr 'int' Var='rsIntIter')
- // (IntegerLiteral 'int' 0))
- // (BinaryOperator 'int' '<'
- // (DeclRefExpr 'int' Var='rsIntIter')
- // (IntegerLiteral 'int' 10)
- // nullptr << CondVar >>
- // (UnaryOperator 'int' postfix '++'
+ // (ForStmt
+ // (DeclStmt
+ // (VarDecl used rsIntIter 'int' cinit
+ // (IntegerLiteral 'int' 0)))
+ // (BinaryOperator 'int' '<'
+ // (ImplicitCastExpr int LValueToRValue
// (DeclRefExpr 'int' Var='rsIntIter'))
- // (CallExpr 'void'
- // (ImplicitCastExpr 'void (*)(rs_font *)' <FunctionToPointerDecay>
- // (DeclRefExpr 'void (rs_font *)' FunctionDecl='rsClearObject'))
- // (UnaryOperator 'rs_font *' prefix '&'
- // (ArraySubscriptExpr 'rs_font':'rs_font'
- // (ImplicitCastExpr 'rs_font *' <ArrayToPointerDecay>
- // (DeclRefExpr 'rs_font [10]' Var='fontArr'))
- // (DeclRefExpr 'int' Var='rsIntIter')))))))
+ // (IntegerLiteral 'int' 10)
+ // nullptr << CondVar >>
+ // (UnaryOperator 'int' postfix '++'
+ // (DeclRefExpr 'int' Var='rsIntIter'))
+ // (CallExpr 'void'
+ // (ImplicitCastExpr 'void (*)(rs_font *)' <FunctionToPointerDecay>
+ // (DeclRefExpr 'void (rs_font *)' FunctionDecl='rsClearObject'))
+ // (UnaryOperator 'rs_font *' prefix '&'
+ // (ArraySubscriptExpr 'rs_font':'rs_font'
+ // (ImplicitCastExpr 'rs_font *' <ArrayToPointerDecay>
+ // (DeclRefExpr 'rs_font [10]' Var='fontArr'))
+ // (DeclRefExpr 'int' Var='rsIntIter'))))))
// Create helper variable for iterating through elements
- clang::IdentifierInfo& II = C.Idents.get("rsIntIter");
+ static unsigned sIterCounter = 0;
+ std::stringstream UniqueIterName;
+ UniqueIterName << "rsIntIter" << sIterCounter++;
+ clang::IdentifierInfo *II = &C.Idents.get(UniqueIterName.str());
clang::VarDecl *IIVD =
clang::VarDecl::Create(C,
DC,
StartLoc,
Loc,
- &II,
+ II,
C.IntTy,
C.getTrivialTypeSourceInfo(C.IntTy),
clang::SC_None);
// Mark "rsIntIter" as used
IIVD->markUsed(C);
- clang::Decl *IID = (clang::Decl *)IIVD;
-
- clang::DeclGroupRef DGR = clang::DeclGroupRef::Create(C, &IID, 1);
- StmtArray[StmtCtr++] = new(C) clang::DeclStmt(DGR, Loc, Loc);
// Form the actual destructor loop
// for (Init; Cond; Inc)
// RSClearObjectCall;
- // Init -> "rsIntIter = 0"
- clang::DeclRefExpr *RefrsIntIter =
+ // Init -> "int rsIntIter = 0"
+ clang::Expr *Int0 = clang::IntegerLiteral::Create(C,
+ llvm::APInt(C.getTypeSize(C.IntTy), 0), C.IntTy, Loc);
+ IIVD->setInit(Int0);
+
+ clang::Decl *IID = (clang::Decl *)IIVD;
+ clang::DeclGroupRef DGR = clang::DeclGroupRef::Create(C, &IID, 1);
+ clang::Stmt *Init = new(C) clang::DeclStmt(DGR, Loc, Loc);
+
+ // Cond -> "rsIntIter < NumArrayElements"
+ clang::DeclRefExpr *RefrsIntIterLValue =
clang::DeclRefExpr::Create(C,
clang::NestedNameSpecifierLoc(),
clang::SourceLocation(),
@@ -506,28 +510,22 @@
false,
Loc,
C.IntTy,
- clang::VK_RValue,
+ clang::VK_LValue,
nullptr);
- clang::Expr *Int0 = clang::IntegerLiteral::Create(C,
- llvm::APInt(C.getTypeSize(C.IntTy), 0), C.IntTy, Loc);
+ clang::Expr *RefrsIntIterRValue =
+ clang::ImplicitCastExpr::Create(C,
+ RefrsIntIterLValue->getType(),
+ clang::CK_LValueToRValue,
+ RefrsIntIterLValue,
+ nullptr,
+ clang::VK_RValue);
- clang::BinaryOperator *Init =
- new(C) clang::BinaryOperator(RefrsIntIter,
- Int0,
- clang::BO_Assign,
- C.IntTy,
- clang::VK_RValue,
- clang::OK_Ordinary,
- Loc,
- false);
-
- // Cond -> "rsIntIter < NumArrayElements"
clang::Expr *NumArrayElementsExpr = clang::IntegerLiteral::Create(C,
llvm::APInt(C.getTypeSize(C.IntTy), NumArrayElements), C.IntTy, Loc);
clang::BinaryOperator *Cond =
- new(C) clang::BinaryOperator(RefrsIntIter,
+ new(C) clang::BinaryOperator(RefrsIntIterRValue,
NumArrayElementsExpr,
clang::BO_LT,
C.IntTy,
@@ -538,7 +536,7 @@
// Inc -> "rsIntIter++"
clang::UnaryOperator *Inc =
- new(C) clang::UnaryOperator(RefrsIntIter,
+ new(C) clang::UnaryOperator(RefrsIntIterLValue,
clang::UO_PostInc,
C.IntTy,
clang::VK_RValue,
@@ -558,7 +556,7 @@
clang::Expr *RefRSArrPtrSubscript =
new(C) clang::ArraySubscriptExpr(RefRSArrPtr,
- RefrsIntIter,
+ RefrsIntIterRValue,
BaseType->getCanonicalTypeInternal(),
clang::VK_RValue,
clang::OK_Ordinary,
@@ -588,13 +586,7 @@
Loc,
Loc);
- StmtArray[StmtCtr++] = DestructorLoop;
- slangAssert(StmtCtr == 2);
-
- clang::CompoundStmt *CS = new(C) clang::CompoundStmt(
- C, llvm::makeArrayRef(StmtArray, StmtCtr), Loc, Loc);
-
- return CS;
+ return DestructorLoop;
}
static unsigned CountRSObjectTypes(clang::ASTContext &C,