From: George Burgess IV Date: Tue, 6 Mar 2018 07:42:36 +0000 (+0000) Subject: [ExprConstant] Look through ExprWithCleanups for `allocsize` X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=179aac9d58705772b5c17b0b4136c7cf994c8c62;p=clang [ExprConstant] Look through ExprWithCleanups for `allocsize` git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326766 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index bac2356cc4..135e70e96a 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -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(E)) + E = EC->getSubExpr()->IgnoreParens(); + if (const auto *Cast = dyn_cast(E)) E = Cast->getSubExpr()->IgnoreParens(); diff --git a/test/CodeGenCXX/alloc-size.cpp b/test/CodeGenCXX/alloc-size.cpp index 137d4543dd..275ffe6dca 100644 --- a/test/CodeGenCXX/alloc-size.cpp +++ b/test/CodeGenCXX/alloc-size.cpp @@ -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); +}