]> granicus.if.org Git - clang/commitdiff
Reland r326766 (with a slightly modified test)
authorGeorge Burgess IV <george.burgess.iv@gmail.com>
Wed, 7 Mar 2018 04:52:34 +0000 (04:52 +0000)
committerGeorge Burgess IV <george.burgess.iv@gmail.com>
Wed, 7 Mar 2018 04:52:34 +0000 (04:52 +0000)
The original revert was done in r326869, since reverting r326602 broke
the test added by this.

The new test should be less dependent on r326602.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326872 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/CodeGenCXX/alloc-size.cpp

index 45df133ad57a86f8d66ba5954c6968adbf5466f2..c3e41658c29aaf050b20329a25e74e1c6fc027a6 100644 (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();
 
index ac53ea8f8ea216f2a4aeece306ce6acdd76b437b..34892b8abc2f8fac055de707f5ac2dccc89325c5 100644 (file)
@@ -70,3 +70,19 @@ int testIt() {
          __builtin_object_size(dependent_calloc2<int, 9>(), 0);
 }
 } // namespace templated_alloc_size
+
+// Be sure that an ExprWithCleanups doesn't deter us.
+namespace alloc_size_with_cleanups {
+struct Foo {
+  ~Foo();
+};
+
+void *my_malloc(const Foo &, int N) __attribute__((alloc_size(2)));
+
+// CHECK-LABEL: define i32 lalala
+int testIt() {
+  int *const p = (int *)my_malloc(Foo{}, 3);
+  // CHECK: ret i32 3
+  return __builtin_object_size(p, 0);
+}
+} // namespace alloc_size_with_cleanups