324 lines · cpp
1// RUN: %clang_cc1 -verify -fsyntax-only -std=c++17 -Wshadow-all %s2 3namespace {4 int i; // expected-note {{previous declaration is here}}5 static int s; // expected-note {{previous declaration is here}}6}7 8namespace one {9namespace two {10 int j; // expected-note {{previous declaration is here}}11 typedef int jj; // expected-note 2 {{previous declaration is here}}12 using jjj=int; // expected-note 2 {{previous declaration is here}}13}14}15 16namespace xx {17 int m;18 typedef int mm;19 using mmm=int;20 21}22namespace yy {23 int m;24 typedef char mm;25 using mmm=char;26}27 28using namespace one::two;29using namespace xx;30using namespace yy;31 32void foo() {33 int i; // expected-warning {{declaration shadows a variable in namespace '(anonymous)'}}34 int j; // expected-warning {{declaration shadows a variable in namespace 'one::two'}}35 static int s; // expected-warning {{declaration shadows a variable in namespace '(anonymous)'}}36 int m;37 int mm;38 int mmm;39}40 41class A {42 static int data; // expected-note 1 {{previous declaration}}43 // expected-note@+1 1 {{previous declaration}}44 int field;45 int f1, f2, f3, f4; // expected-note 9 {{previous declaration is here}}46 47 typedef int a1; // expected-note 2 {{previous declaration}}48 using a2=int; // expected-note 2 {{previous declaration}}49 50 // The initialization is safe, but the modifications are not.51 A(int f1, int f2, int f3, int f4) // expected-note-re 4 {{variable 'f{{[0-4]}}' is declared here}}52 : f1(f1) {53 f1 = 3; // expected-warning {{modifying constructor parameter 'f1' that shadows a field of 'A'}}54 f1 = 4; // one warning per shadow55 f2++; // expected-warning {{modifying constructor parameter 'f2' that shadows a field of 'A'}}56 --f3; // expected-warning {{modifying constructor parameter 'f3' that shadows a field of 'A'}}57 f4 += 2; // expected-warning {{modifying constructor parameter 'f4' that shadows a field of 'A'}}58 }59 60 // The initialization is safe, but the modifications are not.61 // expected-warning-re@+1 4 {{constructor parameter 'f{{[0-4]}}' shadows the field 'f{{[0-9]}}' of 'A'}}62 A(int f1, int f2, int f3, int f4, double overload_dummy) {}63 64 void test() {65 char *field; // expected-warning {{declaration shadows a field of 'A'}}66 char *data; // expected-warning {{declaration shadows a static data member of 'A'}}67 char *a1; // no warning68 char *a2; // no warning69 char *jj; // no warning70 char *jjj; // no warning71 static char *f1; // expected-warning {{declaration shadows a field of 'A'}}72 }73 74 void test2() {75 typedef char field; // no warning76 typedef char data; // no warning77 typedef char a1; // expected-warning {{declaration shadows a typedef in 'A'}}78 typedef char a2; // expected-warning {{declaration shadows a type alias in 'A'}}79 typedef char jj; // expected-warning {{declaration shadows a typedef in namespace 'one::two'}}80 typedef char jjj; // expected-warning {{declaration shadows a type alias in namespace 'one::two'}}81 }82 83 void test3() {84 using field=char; // no warning85 using data=char; // no warning86 using a1=char; // expected-warning {{declaration shadows a typedef in 'A'}}87 using a2=char; // expected-warning {{declaration shadows a type alias in 'A'}}88 using jj=char; // expected-warning {{declaration shadows a typedef in namespace 'one::two'}}89 using jjj=char; // expected-warning {{declaration shadows a type alias in namespace 'one::two'}}90 }91};92 93struct path {94 using value_type = char;95 typedef char value_type2;96 struct iterator {97 using value_type = path; // no warning98 typedef path value_type2; // no warning99 };100};101 102 103// TODO: this should warn104class B : A {105 int data;106 static int field;107};108 109namespace rdar8900456 {110struct Foo {111 static void Baz();112 static void Baz1();113 static void Baz2();114private:115 int Bar;116};117 118void Foo::Baz() {119 double Bar = 12; // Don't warn.120}121 122void Foo::Baz1() {123 typedef int Bar; // Don't warn.124}125 126void Foo::Baz2() {127 using Bar=int; // Don't warn.128}129}130 131// http://llvm.org/PR9160132namespace PR9160 {133struct V {134 V(int);135};136struct S {137 V v;138 static void m() {139 if (1) {140 V v(0);141 }142 }143};144}145 146extern int bob; // expected-note 1 {{previous declaration is here}}147typedef int bob1; // expected-note 2 {{previous declaration is here}}148using bob2=int; // expected-note 2 {{previous declaration is here}}149 150void rdar8883302() {151 extern int bob; // don't warn for shadowing.152}153 154void test8() {155 int bob; // expected-warning {{declaration shadows a variable in the global namespace}}156 int bob1; //no warning157 int bob2; // no warning158}159 160void test9() {161 typedef int bob; // no warning162 typedef int bob1; // expected-warning {{declaration shadows a typedef in the global namespace}}163 typedef int bob2; // expected-warning {{declaration shadows a type alias in the global namespace}}164}165 166void test10() {167 using bob=int; // no warning168 using bob1=int; // expected-warning {{declaration shadows a typedef in the global namespace}}169 using bob2=int; // expected-warning {{declaration shadows a type alias in the global namespace}}170}171 172namespace rdar29067894 {173 174void avoidWarningWhenRedefining(int b) { // expected-note {{previous definition is here}}175 int a = 0; // expected-note {{previous definition is here}}176 int a = 1; // expected-error {{redefinition of 'a'}}177 int b = 2; // expected-error {{redefinition of 'b'}}178 179 using c=char; // expected-note {{previous definition is here}}180 using c=int; // expected-error {{type alias redefinition with different types ('int' vs 'char')}}181 182 typedef char d; // expected-note {{previous definition is here}}183 typedef int d; // expected-error {{typedef redefinition with different types ('int' vs 'char')}}184 185 using e=char; // expected-note {{previous definition is here}}186 typedef int e; // expected-error {{type alias redefinition with different types ('int' vs 'char')}}187 188 int f; // expected-note {{previous definition is here}}189 using f=int; // expected-error {{redefinition of 'f'}}190 191 using g=int; // expected-note {{previous definition is here}}192 int g; // expected-error {{redefinition of 'g'}}193 194 typedef int h; // expected-note {{previous definition is here}}195 int h; // expected-error {{redefinition of 'h'}}196 197 int k; // expected-note {{previous definition is here}}198 typedef int k; // expected-error {{redefinition of 'k'}}199 200 using l=char; // no warning or error.201 using l=char; // no warning or error.202 typedef char l; // no warning or error.203 204 typedef char n; // no warning or error.205 typedef char n; // no warning or error.206 using n=char; // no warning or error.207}208 209}210 211extern "C" {212typedef int externC; // expected-note {{previous declaration is here}}213}214void handleLinkageSpec() {215 typedef void externC; // expected-warning {{declaration shadows a typedef in the global namespace}}216}217 218namespace PR33947 {219void f(int a) {220 struct A {221 void g(int a) {}222 A() { int a; }223 };224}225}226 227namespace PR34120 {228struct A {229 int B; // expected-note 2 {{declared here}}230};231 232class C : public A {233 void D(int B) {} // expected-warning {{parameter 'B' shadows member inherited from type 'A'}}234 void E() {235 extern void f(int B); // Ok236 }237 void F(int B); // Ok, declaration; not definition.238 void G(int B);239};240 241void C::G(int B) { // expected-warning {{parameter 'B' shadows member inherited from type 'A'}}242}243 244class Private {245 int B;246};247class Derived : Private {248 void D(int B) {} // Ok249};250 251struct Static {252 static int B;253};254 255struct Derived2 : Static {256 void D(int B) {}257};258}259 260int PR24718;261enum class X { PR24718 }; // Ok, not shadowing262 263struct PR24718_1;264struct PR24718_2 {265 enum {266 PR24718_1 // Does not shadow a type.267 };268};269 270namespace structured_binding_tests {271int x; // expected-note {{previous declaration is here}}272int y; // expected-note {{previous declaration is here}}273struct S {274 int a, b;275};276 277void test1() {278 const auto [x, y] = S(); // expected-warning 2 {{declaration shadows a variable in namespace 'structured_binding_tests'}}279}280 281void test2() {282 int a; // expected-note {{previous declaration is here}}283 bool b; // expected-note {{previous declaration is here}}284 {285 auto [a, b] = S(); // expected-warning 2 {{declaration shadows a local variable}}286 }287}288 289class A290{291 int m_a; // expected-note {{previous declaration is here}}292 int m_b; // expected-note {{previous declaration is here}}293 294 void test3() {295 auto [m_a, m_b] = S(); // expected-warning 2 {{declaration shadows a field of 'structured_binding_tests::A'}}296 }297};298 299void test4() {300 const auto [a, b] = S(); // expected-note 3 {{previous declaration is here}}301 {302 int a = 4; // expected-warning {{declaration shadows a structured binding}}303 }304 {305 const auto [a, b] = S(); // expected-warning 2 {{declaration shadows a structured binding}}306 }307}308 309}; // namespace structured_binding_tests310 311namespace GH62588 {312class Outer {313public:314 char *foo(); // expected-note {{previous declaration is here}} \315 // expected-note {{previous definition is here}}316 enum Outer_E { foo }; // expected-error {{redefinition of 'foo'}} \317 // expected-warning {{declaration shadows a static data member of 'GH62588::Outer'}}318 class Inner {319 public:320 enum Inner_E { foo }; // ok321 };322};323} // namespace GH62588324