Author: gbiv Date: Mon Mar 5 23:42:36 2018 New Revision: 326766 URL: http://llvm.org/viewvc/llvm-project?rev=326766&view=rev Log: [ExprConstant] Look through ExprWithCleanups for `allocsize`
Modified: cfe/trunk/lib/AST/ExprConstant.cpp cfe/trunk/test/CodeGenCXX/alloc-size.cpp Modified: cfe/trunk/lib/AST/ExprConstant.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=326766&r1=326765&r2=326766&view=diff ============================================================================== --- cfe/trunk/lib/AST/ExprConstant.cpp (original) +++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Mar 5 23:42:36 2018 @@ -133,7 +133,11 @@ namespace { E = E->IgnoreParens(); // If we're doing a variable assignment from e.g. malloc(N), there will - // probably be a cast of some kind. Ignore it. + // probably be a cast of some kind. In exotic cases, we might also see a + // top-level ExprWithCleanups. Ignore them either way. + if (const auto *EC = dyn_cast<ExprWithCleanups>(E)) + E = EC->getSubExpr()->IgnoreParens(); + if (const auto *Cast = dyn_cast<CastExpr>(E)) E = Cast->getSubExpr()->IgnoreParens(); Modified: cfe/trunk/test/CodeGenCXX/alloc-size.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/alloc-size.cpp?rev=326766&r1=326765&r2=326766&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/alloc-size.cpp (original) +++ cfe/trunk/test/CodeGenCXX/alloc-size.cpp Mon Mar 5 23:42:36 2018 @@ -88,3 +88,15 @@ int callMemberCalloc() { // CHECK: ret i32 32 return __builtin_object_size(C().my_calloc(16, 2), 0); } + +struct D { + ~D(); + void *my_malloc(int N) __attribute__((alloc_size(2))); +}; + +// CHECK-LABEL: define i32 @_Z20callExprWithCleanupsv +int callExprWithCleanups() { + int *const p = (int *)D().my_malloc(3); + // CHECK: ret i32 3 + return __builtin_object_size(p, 0); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits