Clang Project

clang_source_code/test/SemaCXX/warn-missing-variable-declarations.cpp
1// RUN: %clang -Wmissing-variable-declarations -fsyntax-only -Xclang -verify -std=c++17 %s
2
3// Variable declarations that should trigger a warning.
4int vbad1; // expected-warning{{no previous extern declaration for non-static variable 'vbad1'}}
5int vbad2 = 10; // expected-warning{{no previous extern declaration for non-static variable 'vbad2'}}
6
7namespace x {
8  int vbad3; // expected-warning{{no previous extern declaration for non-static variable 'vbad3'}}
9}
10
11// Variable declarations that should not trigger a warning.
12static int vgood1;
13extern int vgood2;
14int vgood2;
15static struct {
16  int mgood1;
17} vgood3;
18
19// Functions should never trigger a warning.
20void fgood1(void);
21void fgood2(void) {
22  int lgood1;
23  static int lgood2;
24}
25static void fgood3(void) {
26  int lgood3;
27  static int lgood4;
28}
29
30// Structures, namespaces and classes should be unaffected.
31struct sgood1 {
32  int mgood2;
33};
34struct {
35  int mgood3;
36} sgood2;
37class CGood1 {
38  static int MGood1;
39};
40int CGood1::MGood1;
41namespace {
42  int mgood4;
43}
44
45class C {
46  void test() {
47    static int x = 0; // no-warn
48  }
49};
50
51// There is also no need to use static in anonymous namespaces.
52namespace {
53  int vgood4;
54}
55
56inline int inline_var = 0;
57const int const_var = 0;
58constexpr int constexpr_var = 0;
59inline constexpr int inline_constexpr_var = 0;
60extern const int extern_const_var = 0; // expected-warning {{no previous extern declaration}}
61extern constexpr int extern_constexpr_var = 0; // expected-warning {{no previous extern declaration}}
62
63template<typename> int var_template = 0;
64template<typename> constexpr int const_var_template = 0;
65template<typename> static int static_var_template = 0;
66
67template int var_template<int[1]>;
68int use_var_template() { return var_template<int[2]>; }
69template int var_template<int[3]>;
70extern template int var_template<int[4]>;
71template<> int var_template<int[5]>; // expected-warning {{no previous extern declaration}}
72
73// FIXME: We give this specialization internal linkage rather than inheriting
74// the linkage from the template! We should not warn here.
75template<> int static_var_template<int[5]>; // expected-warning {{no previous extern declaration}}
76