Bug 1814798 - pt 1. Add bool to enable/disable PHC at runtime r=glandium
[gecko.git] / build / clang-plugin / tests / TestNonParameterChecker.cpp
blob291ef949f687874c6770b1613506534e6d4f9c38
1 #define MOZ_NON_PARAM __attribute__((annotate("moz_non_param")))
3 struct Param {};
4 struct MOZ_NON_PARAM NonParam {};
5 union MOZ_NON_PARAM NonParamUnion {};
6 class MOZ_NON_PARAM NonParamClass {};
7 enum MOZ_NON_PARAM NonParamEnum { X, Y, Z };
8 enum class MOZ_NON_PARAM NonParamEnumClass { X, Y, Z };
10 struct HasNonParamStruct { NonParam x; int y; }; // expected-note 14 {{'HasNonParamStruct' is a non-param type because member 'x' is a non-param type 'NonParam'}}
11 union HasNonParamUnion { NonParam x; int y; }; // expected-note 18 {{'HasNonParamUnion' is a non-param type because member 'x' is a non-param type 'NonParam'}}
12 struct HasNonParamStructUnion { HasNonParamUnion z; }; // expected-note 9 {{'HasNonParamStructUnion' is a non-param type because member 'z' is a non-param type 'HasNonParamUnion'}}
14 #define MAYBE_STATIC
15 #include "NonParameterTestCases.h"
16 #undef MAYBE_STATIC
18 // Do not check typedef and using.
19 typedef void (*funcTypeParam)(Param x);
20 typedef void (*funcTypeNonParam)(NonParam x);
22 using usingFuncTypeParam = void (*)(Param x);
23 using usingFuncTypeNonParam = void (*)(NonParam x);
25 class class_
27 explicit class_(Param x) {}
28 explicit class_(NonParam x) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
29 explicit class_(HasNonParamStruct x) {} //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
30 explicit class_(HasNonParamUnion x) {} //expected-error {{Type 'HasNonParamUnion' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
31 explicit class_(HasNonParamStructUnion x) {} //expected-error {{Type 'HasNonParamStructUnion' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
33 #define MAYBE_STATIC
34 #include "NonParameterTestCases.h"
35 #undef MAYBE_STATIC
38 class classWithStatic
40 #define MAYBE_STATIC static
41 #include "NonParameterTestCases.h"
42 #undef MAYBE_STATIC
45 template <typename T>
46 class tmplClassForParam
48 public:
49 void raw(T x) {}
50 void rawDefault(T x = T()) {}
51 void const_(const T x) {}
52 void ptr(T* x) {}
53 void ref(T& x) {}
54 void constRef(const T& x) {}
56 void notCalled(T x) {}
59 template <typename T>
60 class tmplClassForNonParam
62 public:
63 void raw(T x) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
64 void rawDefault(T x = T()) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
65 void const_(const T x) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
66 void ptr(T* x) {}
67 void ref(T& x) {}
68 void constRef(const T& x) {}
70 void notCalled(T x) {}
73 template <typename T>
74 class tmplClassForHasNonParamStruct
76 public:
77 void raw(T x) {} //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
78 void rawDefault(T x = T()) {} //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
79 void const_(const T x) {} //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
80 void ptr(T* x) {}
81 void ref(T& x) {}
82 void constRef(const T& x) {}
84 void notCalled(T x) {}
87 void testTemplateClass()
89 tmplClassForParam<Param> paramClass;
90 Param param;
91 paramClass.raw(param);
92 paramClass.rawDefault();
93 paramClass.const_(param);
94 paramClass.ptr(&param);
95 paramClass.ref(param);
96 paramClass.constRef(param);
98 tmplClassForNonParam<NonParam> nonParamClass; //expected-note 3 {{The bad argument was passed to 'tmplClassForNonParam' here}}
99 NonParam nonParam;
100 nonParamClass.raw(nonParam);
101 nonParamClass.rawDefault();
102 nonParamClass.const_(nonParam);
103 nonParamClass.ptr(&nonParam);
104 nonParamClass.ref(nonParam);
105 nonParamClass.constRef(nonParam);
107 tmplClassForHasNonParamStruct<HasNonParamStruct> hasNonParamStructClass;//expected-note 3 {{The bad argument was passed to 'tmplClassForHasNonParamStruct' here}}
108 HasNonParamStruct hasNonParamStruct;
109 hasNonParamStructClass.raw(hasNonParamStruct);
110 hasNonParamStructClass.rawDefault();
111 hasNonParamStructClass.const_(hasNonParamStruct);
112 hasNonParamStructClass.ptr(&hasNonParamStruct);
113 hasNonParamStructClass.ref(hasNonParamStruct);
114 hasNonParamStructClass.constRef(hasNonParamStruct);
117 template <typename T>
118 class NestedTemplateInner
120 public:
121 void raw(T x) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
124 template <typename T>
125 class nestedTemplateOuter
127 public:
128 void constRef(const T& x) {
129 NestedTemplateInner<T> inner; //expected-note {{The bad argument was passed to 'NestedTemplateInner' here}}
130 inner.raw(x);
134 void testNestedTemplateClass()
136 nestedTemplateOuter<NonParam> outer;
137 NonParam nonParam;
138 outer.constRef(nonParam); // FIXME: this line needs note "The bad argument was passed to 'constRef' here"
141 template <typename T>
142 void tmplFuncForParam(T x) {}
143 template <typename T>
144 void tmplFuncForNonParam(T x) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
145 template <typename T>
146 void tmplFuncForNonParamImplicit(T x) {} //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
147 template <typename T>
148 void tmplFuncForHasNonParamStruct(T x) {} //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
149 template <typename T>
150 void tmplFuncForHasNonParamStructImplicit(T x) {} //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
152 void testTemplateFunc()
154 Param param;
155 tmplFuncForParam<Param>(param);
157 NonParam nonParam;
158 tmplFuncForNonParam<NonParam>(nonParam); // FIXME: this line needs note "The bad argument was passed to 'tmplFuncForNonParam' here"
159 tmplFuncForNonParamImplicit(nonParam); // FIXME: this line needs note "The bad argument was passed to 'tmplFuncForNonParamImplicit' here"
161 HasNonParamStruct hasNonParamStruct;
162 tmplFuncForHasNonParamStruct<HasNonParamStruct>(hasNonParamStruct); // FIXME: this line needs note "The bad argument was passed to 'tmplFuncForHasNonParamStruct' here"
163 tmplFuncForHasNonParamStructImplicit(hasNonParamStruct); // FIXME: this line needs note "The bad argument was passed to 'tmplFuncForHasNonParamStructImplicit' here"
166 void testLambda()
168 auto paramLambda = [](Param x) -> void {};
169 auto nonParamLambda = [](NonParam x) -> void {}; //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
170 auto nonParamStructLambda = [](HasNonParamStruct x) -> void {}; //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
171 auto nonParamUnionLambda = [](HasNonParamUnion x) -> void {}; //expected-error {{Type 'HasNonParamUnion' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
172 auto nonParamStructUnionLambda = [](HasNonParamStructUnion x) -> void {}; //expected-error {{Type 'HasNonParamStructUnion' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
174 (void)[](Param x) -> void {};
175 (void)[](NonParam x) -> void {}; //expected-error {{Type 'NonParam' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
176 (void)[](HasNonParamStruct x) -> void {}; //expected-error {{Type 'HasNonParamStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
177 (void)[](HasNonParamUnion x) -> void {}; //expected-error {{Type 'HasNonParamUnion' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
178 (void)[](HasNonParamStructUnion x) -> void {}; //expected-error {{Type 'HasNonParamStructUnion' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
181 struct alignas(16) AlignasStruct { char a; ~AlignasStruct(); }; // expected-note {{'AlignasStruct' is a non-param type because it has an explicit alignment of '16'}}
182 void takesAlignasStruct(AlignasStruct x) { } // expected-error {{Type 'AlignasStruct' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
183 void takesAlignasStructByRef(const AlignasStruct& x) { }
185 struct AlignasMember { alignas(16) char a; ~AlignasMember(); }; // expected-note {{'AlignasMember' is a non-param type because member 'a' has an explicit alignment of '16'}}
186 void takesAlignasMember(AlignasMember x) { } // expected-error {{Type 'AlignasMember' must not be used as parameter}} expected-note {{Please consider passing a const reference instead}}
187 void takesAlignasMemberByRef(const AlignasMember& x) { }