1 // RUN: %clang_cc1 -fsyntax-only -Wuninitialized -Wno-uninitialized-const-reference -fsyntax-only -fcxx-exceptions %s -verify -std=c++1y
3 // Stub out types for 'typeid' to work.
4 namespace std
{ class type_info
{}; }
10 return x
; // no-warning
16 return x
; // no-warning
19 // Don't warn on unevaluated contexts.
20 void unevaluated_tests() {
26 // Warn for glvalue arguments to typeid whose type is polymorphic.
27 struct A
{ virtual ~A() {} };
28 void polymorphic_test() {
29 A
*a
; // expected-note{{initialize the variable 'a' to silence this warning}}
30 (void)typeid(*a
); // expected-warning{{variable 'a' is uninitialized when used here}}
33 // Handle cases where the CFG may constant fold some branches, thus
34 // mitigating the need for some path-sensitivity in the analysis.
38 const bool flag
= true;
39 if (flag
&& (x
= test3_aux()) == 0) {
46 const bool flag
= true;
47 if (flag
&& (x
= test3_aux()) == 0) {
50 return x
; // no-warning
53 unsigned x
; // expected-note{{initialize the variable 'x' to silence this warning}}
54 const bool flag
= false;
55 if (flag
&& (x
= test3_aux()) == 0) {
58 return x
; // expected-warning{{variable 'x' is uninitialized when used here}}
65 test4_A a
; // expected-note{{variable 'a' is declared here}}
66 return a
; // expected-warning{{variable 'a' is uninitialized when used here}}
69 // Test variables getting invalidated by function calls with reference arguments
70 // *AND* there are multiple invalidated arguments.
71 void test5_aux(int &, int &);
76 return x
+ y
; // no-warning
79 // This test previously crashed Sema.
82 virtual ~Rdar9188004A();
85 template< typename T
> class Rdar9188004B
: public Rdar9188004A
{
86 virtual double *foo(Rdar9188004B
*next
) const {
87 double *values
= next
->foo(0);
96 class Rdar9188004C
: public Rdar9188004B
<Rdar9188004A
> {
97 virtual void bar(void) const;
99 void Rdar9188004C::bar(void) const {}
101 // Don't warn about uninitialized variables in unreachable code.
105 (void)static_cast<float>(x
); // no-warning
109 // Don't warn about variables declared in "catch"
110 void RDar9251392_bar(const char *msg
);
116 catch (const char* msg
) {
117 RDar9251392_bar(msg
); // no-warning
121 // Test handling of "no-op" casts.
122 void test_noop_cast()
125 int y
= (int&)x
; // no-warning
128 void test_noop_cast2() {
129 int x
; // expected-note {{initialize the variable 'x' to silence this warning}}
130 int y
= (int&)x
; // expected-warning {{uninitialized when used here}}
133 // Test handling of bit casts.
134 void test_bitcasts() {
136 int y
= (float &)x
; // no-warning
139 void test_bitcasts_2() {
140 int x
; // expected-note {{initialize the variable 'x' to silence this warning}}
141 int y
= (float &)x
; // expected-warning {{uninitialized when used here}}
144 void consume_const_ref(const int &n
);
145 int test_const_ref() {
146 int n
; // expected-note {{variable}}
147 consume_const_ref(n
);
148 return n
; // expected-warning {{uninitialized when used here}}
152 auto PR19996
= [a
=0]{int t
; return a
;};