[cfe-commits] r133235 - in /cfe/trunk: lib/CodeGen/CGExprAgg.cpp lib/Sema/SemaExpr.cpp test/CodeGenCXX/compound-literals.cpp
Eli Friedman
eli.friedman at gmail.com
Fri Jun 17 03:23:34 PDT 2011
On Thu, Jun 16, 2011 at 9:59 PM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Thu Jun 16 23:59:12 2011
> New Revision: 133235
>
> URL: http://llvm.org/viewvc/llvm-project?rev=133235&view=rev
> Log:
> Implement proper support for generating code for compound literals in
> C++, which means:
> - binding the temporary as needed in Sema, so that we generate the
> appropriate call to the destructor, and
> - emitting the compound literal into the appropriate location for
> the aggregate, rather than trying to emit it as a temporary and
> memcpy() it.
>
> Fixes PR10138 / <rdar://problem/9615901>.
>
>
> Added:
> cfe/trunk/test/CodeGenCXX/compound-literals.cpp (with props)
> Modified:
> cfe/trunk/lib/CodeGen/CGExprAgg.cpp
> cfe/trunk/lib/Sema/SemaExpr.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=133235&r1=133234&r2=133235&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Thu Jun 16 23:59:12 2011
> @@ -91,9 +91,7 @@
> void VisitMemberExpr(MemberExpr *ME) { EmitAggLoadOfLValue(ME); }
> void VisitUnaryDeref(UnaryOperator *E) { EmitAggLoadOfLValue(E); }
> void VisitStringLiteral(StringLiteral *E) { EmitAggLoadOfLValue(E); }
> - void VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
> - EmitAggLoadOfLValue(E);
> - }
> + void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
> void VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
> EmitAggLoadOfLValue(E);
> }
> @@ -247,6 +245,13 @@
> EmitFinalDestCopy(e, CGF.getOpaqueLValueMapping(e));
> }
>
> +void
> +AggExprEmitter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
> + AggValueSlot Slot = EnsureSlot(E->getType());
> + CGF.EmitAggExpr(E->getInitializer(), Slot);
> +}
> +
Does this work properly with code like the following?
typedef struct S { int x,y; } S;
S x(struct S s) { s = (S){s.y,s.x}; return s; }
-Eli
More information about the cfe-commits
mailing list