[cfe-commits] r166849 - /cfe/trunk/lib/CodeGen/CGExpr.cpp
Eli Friedman
eli.friedman at gmail.com
Fri Oct 26 17:51:30 PDT 2012
On Fri, Oct 26, 2012 at 5:43 PM, Rafael Espindola
<rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Fri Oct 26 19:43:14 2012
> New Revision: 166849
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166849&view=rev
> Log:
> Refactor some code into a new findMaterializedTemporary function.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGExpr.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=166849&r1=166848&r2=166849&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Oct 26 19:43:14 2012
> @@ -228,6 +228,27 @@
> }
>
> static const Expr *
> +findMaterializedTemporary(const Expr *E, const MaterializeTemporaryExpr *&MTE) {
> + // Look through single-element init lists that claim to be lvalues. They're
> + // just syntactic wrappers in this case.
> + if (const InitListExpr *ILE = dyn_cast<InitListExpr>(E)) {
> + if (ILE->getNumInits() == 1 && ILE->isGLValue())
> + E = ILE->getInit(0);
> + }
> +
> + // Look through expressions for materialized temporaries (for now).
> + if (const MaterializeTemporaryExpr *M
> + = dyn_cast<MaterializeTemporaryExpr>(E)) {
> + MTE = M;
> + E = M->GetTemporaryExpr();
> + }
> +
> + if (const CXXDefaultArgExpr *DAE = dyn_cast<CXXDefaultArgExpr>(E))
> + E = DAE->getExpr();
> + return E;
> +}
> +
> +static const Expr *
> skipRValueSubobjectAdjustments(const Expr *E,
> SmallVectorImpl<SubobjectAdjustment> &Adjustments) {
> while (true) {
> @@ -279,32 +300,18 @@
> const CXXDestructorDecl *&ReferenceTemporaryDtor,
> QualType &ObjCARCReferenceLifetimeType,
> const NamedDecl *InitializedDecl) {
> - // Look through single-element init lists that claim to be lvalues. They're
> - // just syntactic wrappers in this case.
> - if (const InitListExpr *ILE = dyn_cast<InitListExpr>(E)) {
> - if (ILE->getNumInits() == 1 && ILE->isGLValue())
> - E = ILE->getInit(0);
> - }
> + const MaterializeTemporaryExpr *M = NULL;
> + E = findMaterializedTemporary(E, M);
> + // Objective-C++ ARC:
> + // If we are binding a reference to a temporary that has ownership, we
> + // need to perform retain/release operations on the temporary.
> + if (M && CGF.getContext().getLangOpts().ObjCAutoRefCount &&
> + M->getType()->isObjCLifetimeType() &&
> + (M->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
> + M->getType().getObjCLifetime() == Qualifiers::OCL_Weak ||
> + M->getType().getObjCLifetime() == Qualifiers::OCL_Autoreleasing))
> + ObjCARCReferenceLifetimeType = M->getType();
>
> - // Look through expressions for materialized temporaries (for now).
> - if (const MaterializeTemporaryExpr *M
> - = dyn_cast<MaterializeTemporaryExpr>(E)) {
> - // Objective-C++ ARC:
> - // If we are binding a reference to a temporary that has ownership, we
> - // need to perform retain/release operations on the temporary.
> - if (CGF.getContext().getLangOpts().ObjCAutoRefCount &&
> - E->getType()->isObjCLifetimeType() &&
> - (E->getType().getObjCLifetime() == Qualifiers::OCL_Strong ||
> - E->getType().getObjCLifetime() == Qualifiers::OCL_Weak ||
> - E->getType().getObjCLifetime() == Qualifiers::OCL_Autoreleasing))
> - ObjCARCReferenceLifetimeType = E->getType();
> -
> - E = M->GetTemporaryExpr();
> - }
> -
> - if (const CXXDefaultArgExpr *DAE = dyn_cast<CXXDefaultArgExpr>(E))
> - E = DAE->getExpr();
> -
This old and new versions aren't precisely equivalent; is that intentional?
-Eli
More information about the cfe-commits
mailing list