[ExprConstant] Look through ExprWithCleanups for `allocsize`

llvm-svn: 326766
This commit is contained in:
George Burgess IV 2018-03-06 07:42:36 +00:00
parent fa5a04fb86
commit 9753b7903d
2 changed files with 17 additions and 1 deletions

View File

@ -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();

View File

@ -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);
}