brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 821f3c0 Raw
95 lines · plain
1.. title:: clang-tidy - misc-definitions-in-headers2 3misc-definitions-in-headers4===========================5 6Finds non-extern non-inline function and variable definitions in header files,7which can lead to potential ODR violations in case these headers are included8from multiple translation units.9 10.. code-block:: c++11 12   // Foo.h13   int a = 1; // Warning: variable definition.14   extern int d; // OK: extern variable.15 16   namespace N {17     int e = 2; // Warning: variable definition.18   }19 20   // Warning: variable definition.21   const char* str = "foo";22 23   // OK: internal linkage variable definitions are ignored for now.24   // Although these might also cause ODR violations, we can be less certain and25   // should try to keep the false-positive rate down.26   static int b = 1;27   const int c = 1;28   const char* const str2 = "foo";29   constexpr int k = 1;30   namespace { int x = 1; }31 32   // Warning: function definition.33   int g() {34     return 1;35   }36 37   // OK: inline function definition is allowed to be defined multiple times.38   inline int e() {39     return 1;40   }41 42   class A {43   public:44     int f1() { return 1; } // OK: implicitly inline member function definition is allowed.45     int f2();46 47     static int d;48   };49 50   // Warning: not an inline member function definition.51   int A::f2() { return 1; }52 53   // OK: class static data member declaration is allowed.54   int A::d = 1;55 56   // OK: function template is allowed.57   template<typename T>58   T f3() {59     T a = 1;60     return a;61   }62 63   // Warning: full specialization of a function template is not allowed.64   template <>65   int f3() {66     int a = 1;67     return a;68   }69 70   template <typename T>71   struct B {72     void f1();73   };74 75   // OK: member function definition of a class template is allowed.76   template <typename T>77   void B<T>::f1() {}78 79   class CE {80     constexpr static int i = 5; // OK: inline variable definition.81   };82 83   inline int i = 5; // OK: inline variable definition.84 85   constexpr int f10() { return 0; } // OK: constexpr function implies inline.86 87   // OK: C++14 variable templates are inline.88   template <class T>89   constexpr T pi = T(3.1415926L);90 91When :program:`clang-tidy` is invoked with the `--fix-notes` option, this check92provides fixes that automatically add the ``inline`` keyword to discovered93functions. Please note that the addition of the ``inline`` keyword to variables94is not currently supported by this check.95