On Dec 2, 2010, at 10:29 AM, Chris Lattner wrote:

> Author: lattner
> Date: Thu Dec  2 12:29:00 2010
> New Revision: 120722
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=120722&view=rev
> Log:
> fix PR8726 by teaching the aggregate init optimization code to handle 
> structs with references in them correctly.
> 
> 
> Modified:
>    cfe/trunk/lib/CodeGen/CGExprAgg.cpp
>    cfe/trunk/test/CodeGenCXX/value-init.cpp
> 
> Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=120722&r1=120721&r2=120722&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Thu Dec  2 12:29:00 2010
> @@ -738,6 +738,39 @@
>   if (ILE == 0 || !CGF.getTypes().isZeroInitializable(ILE->getType()))
>     return CGF.getContext().getTypeSize(E->getType())/8;
> 
> +  // InitListExprs for structs have to be handled carefully.  If there are
> +  // reference members, we need to consider the size of the reference, not 
> the
> +  // referencee.  InitListExprs for unions and arrays can't have references.
> +  if (!E->getType()->isUnionType() && !E->getType()->isArrayType()) {
> +    RecordDecl *SD = E->getType()->getAs<RecordType>()->getDecl();
> +    uint64_t NumNonZeroBytes = 0;

While I know that "if it's not a union or an array, it's a struct" holds for 
aggregates, it feels needlessly indirect. How about:

        if (const RecordType *Record = E->getType()->getAs<RecordType>()) {
                if (!Record->getDecl()->isUnion()) {
                }
        }

?

It's also more efficient ;)


        - Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to