+ // Bail out if the type of the ConstantStruct does not have the same layout + // as the type of the InitListExpr. + if (CGM.getTypes().ConvertType(Field->getType()) != EltInit->getType()) + return false;
I don't think that's quite enough; even if all the types of the `ConstantStruct` match the types of the fields, the fields might be at different offsets (due to an alignment attribute). This could happen if the original initializer initializes one member of a union and the update expression initializes a different member. Use `getStructLayout` on the `DataLayout` object to find the offset of the fields within the `ConstantStruct` and compare them to the offset from the `ASTRecordLayout` object. On Fri, Jun 5, 2015 at 5:50 PM, Yunzhong Gao < [email protected]> wrote: > http://reviews.llvm.org/D5789 > > Files: > include/clang/AST/DataRecursiveASTVisitor.h > include/clang/AST/Expr.h > include/clang/AST/RecursiveASTVisitor.h > include/clang/Basic/StmtNodes.td > include/clang/Serialization/ASTBitCodes.h > lib/AST/Expr.cpp > lib/AST/ExprClassification.cpp > lib/AST/ExprConstant.cpp > lib/AST/ItaniumMangle.cpp > lib/AST/StmtPrinter.cpp > lib/AST/StmtProfile.cpp > lib/CodeGen/CGExprAgg.cpp > lib/CodeGen/CGExprCXX.cpp > lib/CodeGen/CGExprConstant.cpp > lib/Sema/SemaExceptionSpec.cpp > lib/Sema/SemaInit.cpp > lib/Sema/TreeTransform.h > lib/Serialization/ASTReaderStmt.cpp > lib/Serialization/ASTWriter.cpp > lib/Serialization/ASTWriterStmt.cpp > lib/StaticAnalyzer/Core/ExprEngine.cpp > test/Analysis/designated-initializer.c > test/CodeGen/partial-reinitialization1.c > test/CodeGen/partial-reinitialization2.c > test/PCH/designated-init.c.h > test/Sema/designated-initializers.c > test/SemaCXX/decltype.cpp > tools/libclang/CXCursor.cpp > > EMAIL PREFERENCES > http://reviews.llvm.org/settings/panel/emailpreferences/ >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
