1 #define MOZ_NON_PARAM __attribute__((annotate("moz_non_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'}}
15 #include "NonParameterTestCases.h"
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
);
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}}
34 #include "NonParameterTestCases.h"
40 #define MAYBE_STATIC static
41 #include "NonParameterTestCases.h"
46 class tmplClassForParam
50 void rawDefault(T x
= T()) {}
51 void const_(const T x
) {}
54 void constRef(const T
& x
) {}
56 void notCalled(T x
) {}
60 class tmplClassForNonParam
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}}
68 void constRef(const T
& x
) {}
70 void notCalled(T x
) {}
74 class tmplClassForHasNonParamStruct
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}}
82 void constRef(const T
& x
) {}
84 void notCalled(T x
) {}
87 void testTemplateClass()
89 tmplClassForParam
<Param
> paramClass
;
91 paramClass
.raw(param
);
92 paramClass
.rawDefault();
93 paramClass
.const_(param
);
94 paramClass
.ptr(¶m
);
95 paramClass
.ref(param
);
96 paramClass
.constRef(param
);
98 tmplClassForNonParam
<NonParam
> nonParamClass
; //expected-note 3 {{The bad argument was passed to 'tmplClassForNonParam' here}}
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
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
128 void constRef(const T
& x
) {
129 NestedTemplateInner
<T
> inner
; //expected-note {{The bad argument was passed to 'NestedTemplateInner' here}}
134 void testNestedTemplateClass()
136 nestedTemplateOuter
<NonParam
> outer
;
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()
155 tmplFuncForParam
<Param
>(param
);
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"
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
) { }