1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify -w %s
3 extern bool clang_analyzer_eval(bool);
6 Trivial(int x) : value(x) {}
10 struct NonTrivial : public Trivial {
11 NonTrivial(int x) : Trivial(x) {}
16 Trivial getTrivial() {
17 return Trivial(42); // no-warning
20 const Trivial &getTrivialRef() {
21 return Trivial(42); // expected-warning {{Address of stack memory associated with temporary object of type 'Trivial' returned to caller}}
25 NonTrivial getNonTrivial() {
26 return NonTrivial(42); // no-warning
29 const NonTrivial &getNonTrivialRef() {
30 return NonTrivial(42); // expected-warning {{Address of stack memory associated with temporary object of type 'NonTrivial' returned to caller}}
33 namespace rdar13265460 {
34 struct TrivialSubclass : public Trivial {
35 TrivialSubclass(int x) : Trivial(x), anotherValue(-x) {}
39 TrivialSubclass getTrivialSub() {
40 TrivialSubclass obj(1);
42 obj.anotherValue = -42;
46 void testImmediate() {
47 TrivialSubclass obj = getTrivialSub();
49 clang_analyzer_eval(obj.value == 42); // expected-warning{{TRUE}}
50 clang_analyzer_eval(obj.anotherValue == -42); // expected-warning{{TRUE}}
52 clang_analyzer_eval(getTrivialSub().value == 42); // expected-warning{{TRUE}}
53 clang_analyzer_eval(getTrivialSub().anotherValue == -42); // expected-warning{{TRUE}}
56 void testMaterializeTemporaryExpr() {
57 const TrivialSubclass &ref = getTrivialSub();
58 clang_analyzer_eval(ref.value == 42); // expected-warning{{TRUE}}
60 const Trivial &baseRef = getTrivialSub();
61 clang_analyzer_eval(baseRef.value == 42); // expected-warning{{TRUE}}
65 namespace rdar13281951 {
66 struct Derived : public Trivial {
67 Derived(int value) : Trivial(value), value2(-value) {}
74 const Trivial * const &pointerRef = &obj;
75 clang_analyzer_eval(pointerRef->value == 42); // expected-warning{{TRUE}}