tmatheson updated this revision to Diff 311529. tmatheson added a comment. Rebased
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D93101/new/ https://reviews.llvm.org/D93101 Files: clang/lib/AST/ExprConstant.cpp clang/test/CodeGenCXX/bitfield-layout.cpp Index: clang/test/CodeGenCXX/bitfield-layout.cpp =================================================================== --- clang/test/CodeGenCXX/bitfield-layout.cpp +++ clang/test/CodeGenCXX/bitfield-layout.cpp @@ -84,3 +84,12 @@ // CHECK: ret i32 0 return 0; } + +// CHECK: define i32 @_Z10test_truncv() +int test_trunc() { + union { + int i : 4; + } U = {15}; + return U.i; + // CHECK: ret i32 -1 +} Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -9798,7 +9798,10 @@ ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, isa<CXXDefaultInitExpr>(InitExpr)); - return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr); + return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr) || + (Field->isBitField() && + truncateBitfieldValue(Info, InitExpr, Result.getUnionValue(), + Field)); } if (!Result.hasValue())
Index: clang/test/CodeGenCXX/bitfield-layout.cpp =================================================================== --- clang/test/CodeGenCXX/bitfield-layout.cpp +++ clang/test/CodeGenCXX/bitfield-layout.cpp @@ -84,3 +84,12 @@ // CHECK: ret i32 0 return 0; } + +// CHECK: define i32 @_Z10test_truncv() +int test_trunc() { + union { + int i : 4; + } U = {15}; + return U.i; + // CHECK: ret i32 -1 +} Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -9798,7 +9798,10 @@ ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, isa<CXXDefaultInitExpr>(InitExpr)); - return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr); + return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr) || + (Field->isBitField() && + truncateBitfieldValue(Info, InitExpr, Result.getUnionValue(), + Field)); } if (!Result.hasValue())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits