brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 7204d65 Raw
56 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -fexceptions -Wuninitialized-const-reference -verify %s2 3class A {4public:5  int i;6  A(){};7  A(const A &a){};8  A(int i) {}9  bool operator!=(const A &);10};11 12template <class T>13void ignore_template(const T &) {}14void ignore(const int &i) {}15void dont_ignore_non_empty(const int &i) { ; } // Calling this won't silence the warning for you16void dont_ignore_block(const int &i) {17  {}18} // Calling this won't silence the warning for you19void ignore_function_try_block_maybe_who_knows(const int &) try {20} catch (...) {21}22A const_ref_use_A(const A &a);23int const_ref_use(const int &i);24A const_use_A(const A a);25int const_use(const int i);26 27void f(int a) {28  int i;29  const_ref_use(i);             // expected-warning {{variable 'i' is uninitialized when passed as a const reference argument here}}30  int j = j + const_ref_use(j); // expected-warning {{variable 'j' is uninitialized when used within its own initialization}}31  A a1 = const_ref_use_A(a1);   // expected-warning {{variable 'a1' is uninitialized when passed as a const reference argument here}}32  int k = const_use(k);         // expected-warning {{variable 'k' is uninitialized when used within its own initialization}}33  A a2 = const_use_A(a2);       // expected-warning {{variable 'a2' is uninitialized when used within its own initialization}}34  A a3(const_ref_use_A(a3));    // expected-warning {{variable 'a3' is uninitialized when passed as a const reference argument here}}35  A a4 = a3 != a4;              // expected-warning {{variable 'a4' is uninitialized when used within its own initialization}} expected-warning {{variable 'a4' is uninitialized when passed as a const reference argument here}}36  int n = n;                    // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}37  const_ref_use(n);38 39  A a5;40  const_ref_use_A(a5);41 42  int m;43  if (a < 42)44    m = 1;45  const_ref_use(m);46 47  int l;48  ignore_template(l); // This is a pattern to avoid "unused variable" warnings (e.g. boost::ignore_unused).49  ignore(l);50  dont_ignore_non_empty(l); // expected-warning {{variable 'l' is uninitialized when passed as a const reference argument here}}51  int l1;52  dont_ignore_block(l1); // expected-warning {{variable 'l1' is uninitialized when passed as a const reference argument here}}53  int l2;54  ignore_function_try_block_maybe_who_knows(l2); // expected-warning {{variable 'l2' is uninitialized when passed as a const reference argument here}}55}56