Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/test/Analysis/cfg-rich-constructors.cpp
Show First 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | |||||
// CHECK-NEXT: 3: [B1.2]() | // CHECK-NEXT: 3: [B1.2]() | ||||
// CHECK-NEXT: 4: [B1.3] | // CHECK-NEXT: 4: [B1.3] | ||||
// CHECK-NEXT: 5: [B1.4] (CXXConstructExpr, [B1.6], class C) | // CHECK-NEXT: 5: [B1.4] (CXXConstructExpr, [B1.6], class C) | ||||
// CHECK-NEXT: 6: C c = C::get(); | // CHECK-NEXT: 6: C c = C::get(); | ||||
void simpleVariableInitializedByValue() { | void simpleVariableInitializedByValue() { | ||||
C c = C::get(); | C c = C::get(); | ||||
} | } | ||||
// TODO: Should find construction target for the three temporaries as well. | // TODO: Should find construction target for the elidable constructors as well. | ||||
// CHECK: void simpleVariableWithTernaryOperator(bool coin) | // CHECK: void simpleVariableWithTernaryOperator(bool coin) | ||||
// CHECK: [B1] | // CHECK: [B1] | ||||
// CHECK-NEXT: 1: [B4.2] ? [B2.5] : [B3.6] | // CHECK-NEXT: 1: [B4.2] ? [B2.5] : [B3.6] | ||||
// CHECK-NEXT: 2: [B1.1] | // CHECK-NEXT: 2: [B1.1] | ||||
// CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.4], class C) | // CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.4], class C) | ||||
// CHECK-NEXT: 4: C c = coin ? C::get() : C(0); | // CHECK-NEXT: 4: C c = coin ? C::get() : C(0); | ||||
// CHECK: [B2] | // CHECK: [B2] | ||||
// CHECK-NEXT: 1: C::get | // CHECK-NEXT: 1: C::get | ||||
// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | // CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | ||||
// CHECK-NEXT: 3: [B2.2]() | // CHECK-NEXT: 3: [B2.2]() | ||||
// CHECK-NEXT: 4: [B2.3] | // CHECK-NEXT: 4: [B2.3] | ||||
// CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class C) | // CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class C) | ||||
// CHECK: [B3] | // CHECK: [B3] | ||||
// CHECK-NEXT: 1: 0 | // CHECK-NEXT: 1: 0 | ||||
// CHECK-NEXT: 2: [B3.1] (ImplicitCastExpr, NullToPointer, class C *) | // CHECK-NEXT: 2: [B3.1] (ImplicitCastExpr, NullToPointer, class C *) | ||||
// CHECK-NEXT: 3: [B3.2] (CXXConstructExpr, class C) | // CHECK-NEXT: 3: [B3.2] (CXXConstructExpr, [B3.5], class C) | ||||
// CHECK-NEXT: 4: C([B3.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | // CHECK-NEXT: 4: C([B3.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | ||||
// CHECK-NEXT: 5: [B3.4] | // CHECK-NEXT: 5: [B3.4] | ||||
// CHECK-NEXT: 6: [B3.5] (CXXConstructExpr, class C) | // CHECK-NEXT: 6: [B3.5] (CXXConstructExpr, class C) | ||||
// CHECK: [B4] | // CHECK: [B4] | ||||
// CHECK-NEXT: 1: coin | // CHECK-NEXT: 1: coin | ||||
// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool) | // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool) | ||||
// CHECK-NEXT: T: [B4.2] ? ... : ... | // CHECK-NEXT: T: [B4.2] ? ... : ... | ||||
void simpleVariableWithTernaryOperator(bool coin) { | void simpleVariableWithTernaryOperator(bool coin) { | ||||
C c = coin ? C::get() : C(0); | C c = coin ? C::get() : C(0); | ||||
} | } | ||||
// CHECK: void simpleVariableWithElidableCopy() | |||||
// CHECK: 1: 0 | |||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NullToPointer, class C *) | |||||
// CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.5], class C) | |||||
// CHECK-NEXT: 4: C([B1.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | |||||
// CHECK-NEXT: 5: [B1.4] | |||||
// CHECK-NEXT: 6: [B1.5] (CXXConstructExpr, [B1.7], class C) | |||||
// CHECK-NEXT: 7: C c = C(0); | |||||
void simpleVariableWithElidableCopy() { | |||||
C c = C(0); | |||||
} | |||||
// CHECK: void referenceVariableWithConstructor() | // CHECK: void referenceVariableWithConstructor() | ||||
// CHECK: 1: 0 | // CHECK: 1: 0 | ||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NullToPointer, class C *) | // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NullToPointer, class C *) | ||||
// CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.4], const class C) | // CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.4], const class C) | ||||
// CHECK-NEXT: 4: [B1.3] | // CHECK-NEXT: 4: [B1.3] | ||||
// CHECK-NEXT: 5: const C &c(0); | // CHECK-NEXT: 5: const C &c(0); | ||||
void referenceVariableWithConstructor() { | void referenceVariableWithConstructor() { | ||||
const C &c(0); | const C &c(0); | ||||
} | } | ||||
// TODO: Should find construction target here. | // TODO: Should find construction target here. | ||||
// CHECK: void referenceVariableWithInitializer() | // CHECK: void referenceVariableWithInitializer() | ||||
// CHECK: 1: C() (CXXConstructExpr, class C) | // CHECK: 1: C() (CXXConstructExpr, class C) | ||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NoOp, const class C) | // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NoOp, const class C) | ||||
// CHECK-NEXT: 3: [B1.2] | // CHECK-NEXT: 3: [B1.2] | ||||
// CHECK-NEXT: 4: const C &c = C(); | // CHECK-NEXT: 4: const C &c = C(); | ||||
void referenceVariableWithInitializer() { | void referenceVariableWithInitializer() { | ||||
const C &c = C(); | const C &c = C(); | ||||
} | } | ||||
// TODO: Should find construction targets here. | // TODO: Should find construction targets for the elidable constructors as well. | ||||
// CHECK: void referenceVariableWithTernaryOperator(bool coin) | // CHECK: void referenceVariableWithTernaryOperator(bool coin) | ||||
// CHECK: [B1] | // CHECK: [B1] | ||||
// CHECK-NEXT: 1: [B4.2] ? [B2.5] : [B3.6] | // CHECK-NEXT: 1: [B4.2] ? [B2.5] : [B3.6] | ||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NoOp, const class C) | // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NoOp, const class C) | ||||
// CHECK-NEXT: 3: [B1.2] | // CHECK-NEXT: 3: [B1.2] | ||||
// CHECK-NEXT: 4: const C &c = coin ? C::get() : C(0); | // CHECK-NEXT: 4: const C &c = coin ? C::get() : C(0); | ||||
// CHECK: [B2] | // CHECK: [B2] | ||||
// CHECK-NEXT: 1: C::get | // CHECK-NEXT: 1: C::get | ||||
// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | // CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | ||||
// CHECK-NEXT: 3: [B2.2]() | // CHECK-NEXT: 3: [B2.2]() | ||||
// CHECK-NEXT: 4: [B2.3] | // CHECK-NEXT: 4: [B2.3] | ||||
// CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class C) | // CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class C) | ||||
// CHECK: [B3] | // CHECK: [B3] | ||||
// CHECK-NEXT: 1: 0 | // CHECK-NEXT: 1: 0 | ||||
// CHECK-NEXT: 2: [B3.1] (ImplicitCastExpr, NullToPointer, class C *) | // CHECK-NEXT: 2: [B3.1] (ImplicitCastExpr, NullToPointer, class C *) | ||||
// CHECK-NEXT: 3: [B3.2] (CXXConstructExpr, class C) | // CHECK-NEXT: 3: [B3.2] (CXXConstructExpr, [B3.5], class C) | ||||
// CHECK-NEXT: 4: C([B3.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | // CHECK-NEXT: 4: C([B3.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | ||||
// CHECK-NEXT: 5: [B3.4] | // CHECK-NEXT: 5: [B3.4] | ||||
// CHECK-NEXT: 6: [B3.5] (CXXConstructExpr, class C) | // CHECK-NEXT: 6: [B3.5] (CXXConstructExpr, class C) | ||||
// CHECK: [B4] | // CHECK: [B4] | ||||
// CHECK-NEXT: 1: coin | // CHECK-NEXT: 1: coin | ||||
// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool) | // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool) | ||||
// CHECK-NEXT: T: [B4.2] ? ... : ... | // CHECK-NEXT: T: [B4.2] ? ... : ... | ||||
void referenceVariableWithTernaryOperator(bool coin) { | void referenceVariableWithTernaryOperator(bool coin) { | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | |||||
// CHECK: 1: C() (CXXConstructExpr, [B1.2], class C) | // CHECK: 1: C() (CXXConstructExpr, [B1.2], class C) | ||||
// CHECK-NEXT: 2: [B1.1] | // CHECK-NEXT: 2: [B1.1] | ||||
// CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.4], class C) | // CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.4], class C) | ||||
// CHECK-NEXT: 4: return [B1.3]; | // CHECK-NEXT: 4: return [B1.3]; | ||||
C returnTemporary() { | C returnTemporary() { | ||||
return C(); | return C(); | ||||
} | } | ||||
// TODO: Should find construction targets for the first constructor as well. | |||||
// CHECK: C returnTemporaryWithArgument() | // CHECK: C returnTemporaryWithArgument() | ||||
// CHECK: 1: nullptr | // CHECK: 1: nullptr | ||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NullToPointer, class C *) | // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NullToPointer, class C *) | ||||
// CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, class C) | // CHECK-NEXT: 3: [B1.2] (CXXConstructExpr, [B1.5], class C) | ||||
// CHECK-NEXT: 4: C([B1.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | // CHECK-NEXT: 4: C([B1.3]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | ||||
// CHECK-NEXT: 5: [B1.4] | // CHECK-NEXT: 5: [B1.4] | ||||
// CHECK-NEXT: 6: [B1.5] (CXXConstructExpr, [B1.7], class C) | // CHECK-NEXT: 6: [B1.5] (CXXConstructExpr, [B1.7], class C) | ||||
// CHECK-NEXT: 7: return [B1.6]; | // CHECK-NEXT: 7: return [B1.6]; | ||||
C returnTemporaryWithArgument() { | C returnTemporaryWithArgument() { | ||||
return C(nullptr); | return C(nullptr); | ||||
} | } | ||||
// CHECK: C returnTemporaryConstructedByFunction() | // CHECK: C returnTemporaryConstructedByFunction() | ||||
// CHECK: 1: C::get | // CHECK: 1: C::get | ||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | ||||
// CHECK-NEXT: 3: [B1.2]() | // CHECK-NEXT: 3: [B1.2]() | ||||
// CHECK-NEXT: 4: [B1.3] | // CHECK-NEXT: 4: [B1.3] | ||||
// CHECK-NEXT: 5: [B1.4] (CXXConstructExpr, [B1.6], class C) | // CHECK-NEXT: 5: [B1.4] (CXXConstructExpr, [B1.6], class C) | ||||
// CHECK-NEXT: 6: return [B1.5]; | // CHECK-NEXT: 6: return [B1.5]; | ||||
C returnTemporaryConstructedByFunction() { | C returnTemporaryConstructedByFunction() { | ||||
return C::get(); | return C::get(); | ||||
} | } | ||||
// TODO: Should find construction targets for the first constructor as well. | |||||
// CHECK: C returnChainOfCopies() | // CHECK: C returnChainOfCopies() | ||||
// CHECK: 1: C::get | // CHECK: 1: C::get | ||||
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class C (*)(void)) | ||||
// CHECK-NEXT: 3: [B1.2]() | // CHECK-NEXT: 3: [B1.2]() | ||||
// CHECK-NEXT: 4: [B1.3] | // CHECK-NEXT: 4: [B1.3] | ||||
// CHECK-NEXT: 5: [B1.4] (CXXConstructExpr, class C) | // CHECK-NEXT: 5: [B1.4] (CXXConstructExpr, [B1.7], class C) | ||||
// CHECK-NEXT: 6: C([B1.5]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | // CHECK-NEXT: 6: C([B1.5]) (CXXFunctionalCastExpr, ConstructorConversion, class C) | ||||
// CHECK-NEXT: 7: [B1.6] | // CHECK-NEXT: 7: [B1.6] | ||||
// CHECK-NEXT: 8: [B1.7] (CXXConstructExpr, [B1.9], class C) | // CHECK-NEXT: 8: [B1.7] (CXXConstructExpr, [B1.9], class C) | ||||
// CHECK-NEXT: 9: return [B1.8]; | // CHECK-NEXT: 9: return [B1.8]; | ||||
C returnChainOfCopies() { | C returnChainOfCopies() { | ||||
return C(C::get()); | return C(C::get()); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 128 Lines • ▼ Show 20 Lines | |||||
// CHECK-NEXT: 8: [B6.7] (BindTemporary) | // CHECK-NEXT: 8: [B6.7] (BindTemporary) | ||||
// CHECK: [B7] | // CHECK: [B7] | ||||
// CHECK-NEXT: 1: coin | // CHECK-NEXT: 1: coin | ||||
// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) | // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) | ||||
// CHECK-NEXT: T: [B7.2] ? ... : ... | // CHECK-NEXT: T: [B7.2] ? ... : ... | ||||
void referenceVariableWithTernaryOperator(bool coin) { | void referenceVariableWithTernaryOperator(bool coin) { | ||||
const D &d = coin ? D::get() : D(0); | const D &d = coin ? D::get() : D(0); | ||||
} | } | ||||
// CHECK: void referenceWithFunctionalCast() | |||||
// CHECK: 1: 1 | |||||
// CHECK-NEXT: 2: [B1.1] (CXXConstructExpr, [B1.3], [B1.5], class temporary_object_expr_with_dtors::D) | |||||
// CHECK-NEXT: 3: [B1.2] (BindTemporary) | |||||
// CHECK-NEXT: 4: temporary_object_expr_with_dtors::D([B1.3]) (CXXFunctionalCastExpr, ConstructorCon | |||||
// CHECK-NEXT: 5: [B1.4] | |||||
// CHECK-NEXT: 6: temporary_object_expr_with_dtors::D &&d = temporary_object_expr_with_dtors::D(1); | |||||
// CHECK-NEXT: 7: [B1.6].~D() (Implicit destructor) | |||||
void referenceWithFunctionalCast() { | |||||
D &&d = D(1); | |||||
} | |||||
} // end namespace temporary_object_expr_with_dtors | } // end namespace temporary_object_expr_with_dtors |