62 lines
1.4 KiB
C++
62 lines
1.4 KiB
C++
|
// RUN: %clang_cc1 -fblocks -Wno-unused-value -std=c++20 -ast-dump -verify %s -ast-dump | FileCheck %s
|
||
|
|
||
|
// expected-no-diagnostics
|
||
|
|
||
|
struct P {
|
||
|
consteval P() {}
|
||
|
};
|
||
|
|
||
|
struct A {
|
||
|
A(int v) { this->data = new int(v); }
|
||
|
const int& get() const {
|
||
|
return *this->data;
|
||
|
}
|
||
|
~A() { delete data; }
|
||
|
private:
|
||
|
int *data;
|
||
|
};
|
||
|
|
||
|
void foo() {
|
||
|
for (;A(1), P(), false;);
|
||
|
// CHECK: foo
|
||
|
// CHECK: ExprWithCleanups
|
||
|
// CHECK-NEXT: BinaryOperator {{.*}} 'bool' ','
|
||
|
// CHECK-NEXT: BinaryOperator {{.*}} 'P' ','
|
||
|
// CHECK-NEXT: CXXFunctionalCastExpr {{.*}} 'A'
|
||
|
// CHECK-NEXT: CXXBindTemporaryExpr {{.*}} 'A'
|
||
|
// CHECK-NEXT: CXXConstructExpr {{.*}} 'A'
|
||
|
// CHECK: ConstantExpr {{.*}} 'P'
|
||
|
// CHECK-NEXT: value:
|
||
|
// CHECK-NEXT: ExprWithCleanups
|
||
|
}
|
||
|
|
||
|
void foobar() {
|
||
|
A a(1);
|
||
|
for (; ^{ auto ptr = &a.get(); }(), P(), false;);
|
||
|
// CHECK: ExprWithCleanups
|
||
|
// CHECK-NEXT: cleanup Block
|
||
|
// CHECK-NEXT: BinaryOperator {{.*}} 'bool' ','
|
||
|
// CHECK-NEXT: BinaryOperator {{.*}} 'P' ','
|
||
|
// CHECK-NEXT: CallExpr
|
||
|
// CHECK-NEXT: BlockExpr
|
||
|
// CHECK: ConstantExpr {{.*}} 'P'
|
||
|
// CHECK-NEXT: value:
|
||
|
// CHECK-NEXT: ExprWithCleanups
|
||
|
// CHECK-NOT: cleanup Block
|
||
|
}
|
||
|
|
||
|
struct B {
|
||
|
int *p = new int(38);
|
||
|
consteval int get() { return *p; }
|
||
|
constexpr ~B() { delete p; }
|
||
|
};
|
||
|
|
||
|
void bar() {
|
||
|
// CHECK: bar
|
||
|
// CHECK: ExprWithCleanups
|
||
|
// CHECK: ConstantExpr
|
||
|
// CHECK-NEXT: value:
|
||
|
// CHECK-NEXT: ExprWithCleanups
|
||
|
int k = B().get();
|
||
|
}
|