1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify %s
template<typename T> void f() {
T t;
t = 17;
}
// PR5407
struct A { A(); };
struct B { ~B(); };
void f() {
A a;
B b;
}
// PR5531
namespace PR5531 {
struct A {
};
struct B {
B(int);
};
struct C {
~C();
};
void test() {
A();
B(17);
C();
}
}
template<typename T>
struct X0 { };
template<typename T>
void test_dependent_init(T *p) {
X0<int> i(p);
(void)i;
}
void unused_local_static() {
static int x = 0;
static int y = 0; // expected-warning{{unused variable 'y'}}
#pragma unused(x)
}
// PR10168
namespace PR10168 {
// We expect a warning in the definition only for non-dependent variables, and
// a warning in the instantiation only for dependent variables.
template<typename T>
struct S {
void f() {
int a; // expected-warning {{unused variable 'a'}}
T b; // expected-warning 2{{unused variable 'b'}}
}
};
template<typename T>
void f() {
int a; // expected-warning {{unused variable 'a'}}
T b; // expected-warning 2{{unused variable 'b'}}
}
void g() {
S<int>().f(); // expected-note {{here}}
S<char>().f(); // expected-note {{here}}
f<int>(); // expected-note {{here}}
f<char>(); // expected-note {{here}}
}
}
namespace PR11550 {
struct S1 {
S1();
};
S1 makeS1();
void testS1(S1 a) {
// This constructor call can be elided.
S1 x = makeS1(); // expected-warning {{unused variable 'x'}}
// This one cannot, so no warning.
S1 y;
// This call cannot, but the constructor is trivial.
S1 z = a; // expected-warning {{unused variable 'z'}}
}
// The same is true even when we know thet constructor has side effects.
void foo();
struct S2 {
S2() {
foo();
}
};
S2 makeS2();
void testS2(S2 a) {
S2 x = makeS2(); // expected-warning {{unused variable 'x'}}
S2 y;
S2 z = a; // expected-warning {{unused variable 'z'}}
}
// Or when the constructor is not declared by the user.
struct S3 {
S1 m;
};
S3 makeS3();
void testS3(S3 a) {
S3 x = makeS3(); // expected-warning {{unused variable 'x'}}
S3 y;
S3 z = a; // expected-warning {{unused variable 'z'}}
}
}
namespace PR19305 {
template<typename T> int n = 0; // no warning
int a = n<int>;
template<typename T> const int l = 0; // no warning
int b = l<int>;
// PR19558
template<typename T> const int o = 0; // no warning
template<typename T> const int o<T*> = 0; // no warning
int c = o<int*>;
template<> int o<void> = 0; // no warning
int d = o<void>;
// FIXME: It'd be nice to warn here.
template<typename T> int m = 0;
template<typename T> int m<T*> = 0;
template<> const int m<void> = 0; // expected-warning {{unused variable}}
}
namespace ctor_with_cleanups {
struct S1 {
~S1();
};
struct S2 {
S2(const S1&);
};
void func() {
S2 s((S1()));
}
}
#include "Inputs/warn-unused-variables.h"
|