37 auto ConstructionWarning =
38 cat(
"constructing basic_string_view from null is undefined; replace with "
39 "the default constructor");
40 auto StaticCastWarning =
41 cat(
"casting to basic_string_view from null is undefined; replace with "
43 auto ArgumentConstructionWarning =
44 cat(
"passing null as basic_string_view is undefined; replace with the "
46 auto AssignmentWarning =
47 cat(
"assignment to basic_string_view from null is undefined; replace "
48 "with the default constructor");
49 auto RelativeComparisonWarning =
50 cat(
"comparing basic_string_view to null is undefined; replace with the "
52 auto EqualityComparisonWarning =
53 cat(
"comparing basic_string_view to null is undefined; replace with the "
57 auto HasBasicStringViewType = hasType(hasUnqualifiedDesugaredType(recordType(
58 hasDeclaration(cxxRecordDecl(hasName(
"::std::basic_string_view"))))));
61 auto NullLiteral = implicitCastExpr(
62 hasCastKind(clang::CK_NullToPointer),
63 hasSourceExpression(ignoringParens(cxxNullPtrLiteralExpr())));
66 auto NullInitList = initListExpr(initCountIs(1), hasInit(0, NullLiteral));
69 auto EmptyInitList = initListExpr(initCountIs(0));
72 auto BasicStringViewConstructingFromNullExpr =
74 HasBasicStringViewType, argumentCountIs(1),
75 hasAnyArgument( anyOf(
76 NullLiteral, NullInitList, EmptyInitList)),
77 unless(cxxTemporaryObjectExpr()),
78 has(expr().bind(
"null_arg_expr")))
79 .bind(
"construct_expr");
82 auto HandleTemporaryCXXFunctionalCastExpr =
83 makeRule(cxxFunctionalCastExpr(hasSourceExpression(
84 BasicStringViewConstructingFromNullExpr)),
85 remove(node(
"null_arg_expr")), ConstructionWarning);
88 auto HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr = makeRule(
89 cxxTemporaryObjectExpr(cxxConstructExpr(
90 HasBasicStringViewType, argumentCountIs(1),
91 hasAnyArgument( anyOf(
92 NullLiteral, NullInitList, EmptyInitList)),
93 has(expr().bind(
"null_arg_expr")))),
94 remove(node(
"null_arg_expr")), ConstructionWarning);
97 auto HandleTemporaryCStyleCastExpr =
98 makeRule(cStyleCastExpr(hasSourceExpression(
99 BasicStringViewConstructingFromNullExpr)),
100 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
103 auto HandleTemporaryCXXStaticCastExpr =
104 makeRule(cxxStaticCastExpr(hasSourceExpression(
105 BasicStringViewConstructingFromNullExpr)),
106 changeTo(node(
"null_arg_expr"), cat(
"\"\"")), StaticCastWarning);
109 auto HandleStackCopyInitialization =
110 makeRule(varDecl(HasBasicStringViewType,
111 hasInitializer(ignoringImpCasts(cxxConstructExpr(
112 BasicStringViewConstructingFromNullExpr,
113 unless(isListInitialization())))),
114 unless(isDirectInitialization())),
115 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
118 auto HandleStackCopyListInitialization =
119 makeRule(varDecl(HasBasicStringViewType,
120 hasInitializer(cxxConstructExpr(
121 BasicStringViewConstructingFromNullExpr,
122 isListInitialization())),
123 unless(isDirectInitialization())),
124 remove(node(
"null_arg_expr")), ConstructionWarning);
127 auto HandleStackDirectInitialization =
128 makeRule(varDecl(HasBasicStringViewType,
129 hasInitializer(cxxConstructExpr(
130 BasicStringViewConstructingFromNullExpr,
131 unless(isListInitialization()))),
132 isDirectInitialization())
134 changeTo(node(
"construct_expr"), cat(name(
"var_decl"))),
135 ConstructionWarning);
138 auto HandleStackDirectListInitialization =
139 makeRule(varDecl(HasBasicStringViewType,
140 hasInitializer(cxxConstructExpr(
141 BasicStringViewConstructingFromNullExpr,
142 isListInitialization())),
143 isDirectInitialization()),
144 remove(node(
"null_arg_expr")), ConstructionWarning);
147 auto HandleFieldInClassCopyInitialization = makeRule(
148 fieldDecl(HasBasicStringViewType,
149 hasInClassInitializer(ignoringImpCasts(
150 cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
151 unless(isListInitialization()))))),
152 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
156 auto HandleFieldInClassCopyListAndDirectListInitialization = makeRule(
157 fieldDecl(HasBasicStringViewType,
158 hasInClassInitializer(ignoringImpCasts(
159 cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
160 isListInitialization())))),
161 remove(node(
"null_arg_expr")), ConstructionWarning);
164 auto HandleConstructorDirectInitialization =
165 makeRule(cxxCtorInitializer(forField(fieldDecl(HasBasicStringViewType)),
166 withInitializer(cxxConstructExpr(
167 BasicStringViewConstructingFromNullExpr,
168 unless(isListInitialization())))),
169 remove(node(
"null_arg_expr")), ConstructionWarning);
172 auto HandleConstructorDirectListInitialization =
173 makeRule(cxxCtorInitializer(forField(fieldDecl(HasBasicStringViewType)),
174 withInitializer(cxxConstructExpr(
175 BasicStringViewConstructingFromNullExpr,
176 isListInitialization()))),
177 remove(node(
"null_arg_expr")), ConstructionWarning);
180 auto HandleDefaultArgumentCopyInitialization =
181 makeRule(parmVarDecl(HasBasicStringViewType,
182 hasInitializer(ignoringImpCasts(cxxConstructExpr(
183 BasicStringViewConstructingFromNullExpr,
184 unless(isListInitialization()))))),
185 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
188 auto HandleDefaultArgumentCopyListInitialization =
189 makeRule(parmVarDecl(HasBasicStringViewType,
190 hasInitializer(cxxConstructExpr(
191 BasicStringViewConstructingFromNullExpr,
192 isListInitialization()))),
193 remove(node(
"null_arg_expr")), ConstructionWarning);
196 auto HandleHeapDirectInitialization = makeRule(
197 cxxNewExpr(has(cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
198 unless(isListInitialization()))),
199 unless(isArray()), unless(hasAnyPlacementArg(anything()))),
200 remove(node(
"null_arg_expr")), ConstructionWarning);
203 auto HandleHeapDirectListInitialization = makeRule(
204 cxxNewExpr(has(cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
205 isListInitialization())),
206 unless(isArray()), unless(hasAnyPlacementArg(anything()))),
207 remove(node(
"null_arg_expr")), ConstructionWarning);
210 auto HandleFunctionArgumentInitialization =
211 makeRule(callExpr(hasAnyArgument(ignoringImpCasts(
212 BasicStringViewConstructingFromNullExpr)),
213 unless(cxxOperatorCallExpr())),
214 changeTo(node(
"construct_expr"), cat(
"\"\"")),
215 ArgumentConstructionWarning);
218 auto HandleAssignment = makeRule(
219 cxxOperatorCallExpr(hasOverloadedOperatorName(
"="),
220 hasRHS(materializeTemporaryExpr(
221 has(BasicStringViewConstructingFromNullExpr)))),
222 changeTo(node(
"construct_expr"), cat(
"{}")), AssignmentWarning);
225 auto HandleRelativeComparison = makeRule(
226 cxxOperatorCallExpr(hasAnyOverloadedOperatorName(
"<",
"<=",
">",
">="),
227 hasEitherOperand(ignoringImpCasts(
228 BasicStringViewConstructingFromNullExpr))),
229 changeTo(node(
"construct_expr"), cat(
"\"\"")), RelativeComparisonWarning);
232 auto HandleEmptyEqualityComparison = makeRule(
234 hasOverloadedOperatorName(
"=="),
235 hasOperands(ignoringImpCasts(BasicStringViewConstructingFromNullExpr),
236 traverse(clang::TK_IgnoreUnlessSpelledInSource,
237 expr().bind(
"instance"))))
239 changeTo(node(
"root"), cat(access(
"instance", cat(
"empty")),
"()")),
240 EqualityComparisonWarning);
243 auto HandleNonEmptyEqualityComparison = makeRule(
245 hasOverloadedOperatorName(
"!="),
246 hasOperands(ignoringImpCasts(BasicStringViewConstructingFromNullExpr),
247 traverse(clang::TK_IgnoreUnlessSpelledInSource,
248 expr().bind(
"instance"))))
250 changeTo(node(
"root"), cat(
"!", access(
"instance", cat(
"empty")),
"()")),
251 EqualityComparisonWarning);
254 auto HandleReturnStatement = makeRule(
255 returnStmt(hasReturnValue(
256 ignoringImpCasts(BasicStringViewConstructingFromNullExpr))),
257 changeTo(node(
"construct_expr"), cat(
"{}")), ConstructionWarning);
260 auto HandleConstructorInvocation =
261 makeRule(cxxConstructExpr(
264 BasicStringViewConstructingFromNullExpr)),
265 unless(HasBasicStringViewType)),
266 changeTo(node(
"construct_expr"), cat(
"\"\"")),
267 ArgumentConstructionWarning);
270 {HandleTemporaryCXXFunctionalCastExpr,
271 HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr,
272 HandleTemporaryCStyleCastExpr,
273 HandleTemporaryCXXStaticCastExpr,
274 HandleStackCopyInitialization,
275 HandleStackCopyListInitialization,
276 HandleStackDirectInitialization,
277 HandleStackDirectListInitialization,
278 HandleFieldInClassCopyInitialization,
279 HandleFieldInClassCopyListAndDirectListInitialization,
280 HandleConstructorDirectInitialization,
281 HandleConstructorDirectListInitialization,
282 HandleDefaultArgumentCopyInitialization,
283 HandleDefaultArgumentCopyListInitialization,
284 HandleHeapDirectInitialization,
285 HandleHeapDirectListInitialization,
286 HandleFunctionArgumentInitialization,
288 HandleRelativeComparison,
289 HandleEmptyEqualityComparison,
290 HandleNonEmptyEqualityComparison,
291 HandleReturnStatement,
292 HandleConstructorInvocation});