| // RUN: %clang_analyze_cc1 \ | |
| // RUN: -analyzer-checker=core,debug.ExprInspection %s -verify | |
| // These test cases demonstrate lack of Static Analyzer features. | |
| // The FIXME: tags indicate where we expect different output. | |
| // Handle constructors for default arguments. | |
| // Default arguments in C++ are recomputed at every call, | |
| // and are therefore local, and not static, variables. | |
| void clang_analyzer_eval(bool); | |
| void clang_analyzer_warnIfReached(); | |
| struct init_with_list { | |
| int a; | |
| init_with_list() : a(1) {} | |
| }; | |
| struct init_in_body { | |
| int a; | |
| init_in_body() { a = 1; } | |
| }; | |
| struct init_default_member { | |
| int a = 1; | |
| }; | |
| struct basic_struct { | |
| int a; | |
| }; | |
| // Top-level analyzed functions. | |
| void top_f(init_with_list l = init_with_list()) { | |
| // We expect that the analyzer doesn't assume anything about the parameter. | |
| clang_analyzer_eval(l.a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| void top_g(init_in_body l = init_in_body()) { | |
| // We expect that the analyzer doesn't assume anything about the parameter. | |
| clang_analyzer_eval(l.a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| void top_h(init_default_member l = init_default_member()) { | |
| // We expect that the analyzer doesn't assume anything about the parameter. | |
| clang_analyzer_eval(l.a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| // Not-top-level analyzed functions. | |
| int called_f(init_with_list l = init_with_list()) { | |
| // We expect that the analyzer assumes the default value | |
| // when called from test2(). | |
| return l.a; | |
| } | |
| int called_g(init_in_body l = init_in_body()) { | |
| // We expect that the analyzer assumes the default value | |
| // when called from test3(). | |
| return l.a; | |
| } | |
| int called_h(init_default_member l = init_default_member()) { | |
| // We expect that the analyzer assumes the default value | |
| // when called from test4(). | |
| return l.a; | |
| } | |
| int called_i(const init_with_list &l = init_with_list()){ | |
| // We expect that the analyzer assumes the default value | |
| // when called from test5(). | |
| return l.a; | |
| } | |
| int called_j(init_with_list &&l = init_with_list()){ | |
| // We expect that the analyzer assumes the default value | |
| // when called from test6(). | |
| return l.a; | |
| } | |
| int plain_parameter_passing(basic_struct l) { | |
| return l.a; | |
| } | |
| void test1() { | |
| basic_struct b; | |
| b.a = 1; | |
| clang_analyzer_eval(plain_parameter_passing(b) == 1); //expected-warning {{TRUE}} | |
| } | |
| void test2() { | |
| // We expect that the analyzer assumes the default value. | |
| // FIXME: Should be TRUE. | |
| clang_analyzer_eval(called_f() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| void test3() { | |
| // We expect that the analyzer assumes the default value. | |
| // FIXME: Should be TRUE. | |
| clang_analyzer_eval(called_g() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| void test4() { | |
| // We expect that the analyzer assumes the default value. | |
| // FIXME: Should be TRUE. | |
| clang_analyzer_eval(called_h() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| void test5() { | |
| //We expect that the analyzer assumes the default value. | |
| // FIXME: Should be TRUE. | |
| clang_analyzer_eval(called_i() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } | |
| void test6() { | |
| // We expect that the analyzer assumes the default value. | |
| // FIXME: Should be TRUE. | |
| clang_analyzer_eval(called_j() == 1); //expected-warning {{TRUE}} expected-warning {{FALSE}} | |
| } |