blob: 8acf2684aa6821fd10aa9a8b5d84c3da0d6471bd [file] [edit]
// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG -std=c++17 %s > %t 2>&1
// RUN: FileCheck --input-file=%t %s
// CHECK-LABEL: void test_eval_order(Map &m, int a, int b)
// CHECK: 1: operator=
// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, Map &(*)(const Map &))
// CHECK-NEXT: 3: operator[]
// CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, FunctionToPointerDecay, Map &(*)(int))
// CHECK-NEXT: 5: m
// CHECK-NEXT: 6: a
// CHECK-NEXT: 7: [B1.6] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT: 8: [B1.5]{{\[\[}}B1.7]] (OperatorCall)
// CHECK-NEXT: 9: [B1.8] (ImplicitCastExpr, NoOp, const Map)
// CHECK-NEXT: 10: operator[]
// CHECK-NEXT: 11: [B1.10] (ImplicitCastExpr, FunctionToPointerDecay, Map &(*)(int))
// CHECK-NEXT: 12: m
// CHECK-NEXT: 13: b
// CHECK-NEXT: 14: [B1.13] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT: 15: [B1.12]{{\[\[}}B1.14]] (OperatorCall)
// CHECK-NEXT: 16: [B1.15] = [B1.9] (OperatorCall)
struct Map {
Map &operator[](int);
Map &operator=(const Map &);
};
void test_eval_order(Map &m, int a, int b) {
m[b] = m[a];
}
struct A {
A();
~A();
A &operator=(const A &);
};
struct B {
B();
~B();
};
struct C {
C();
~C();
};
A &getLHS(const B &);
A &getRHS(const C &);
// CHECK-LABEL: void test_temp_dtor_order()
// CHECK: ~B() (Temporary object destructor)
// CHECK-NEXT: ~C() (Temporary object destructor)
void test_temp_dtor_order() {
getLHS(B()) = getRHS(C());
}