37 const auto ConstructionWarning =
38 cat(
"constructing basic_string_view from null is undefined; replace with "
39 "the default constructor");
40 const auto StaticCastWarning =
41 cat(
"casting to basic_string_view from null is undefined; replace with "
43 const auto ArgumentConstructionWarning =
44 cat(
"passing null as basic_string_view is undefined; replace with the "
46 const auto AssignmentWarning =
47 cat(
"assignment to basic_string_view from null is undefined; replace "
48 "with the default constructor");
49 const auto RelativeComparisonWarning =
50 cat(
"comparing basic_string_view to null is undefined; replace with the "
52 const 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(CK_NullToPointer),
63 hasSourceExpression(ignoringParens(cxxNullPtrLiteralExpr())));
66 auto NullInitList = initListExpr(initCountIs(1), hasInit(0, NullLiteral));
69 auto EmptyInitList = initListExpr(initCountIs(0));
72 const 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 const auto HandleTemporaryCXXFunctionalCastExpr =
83 makeRule(cxxFunctionalCastExpr(hasSourceExpression(
84 BasicStringViewConstructingFromNullExpr)),
85 remove(node(
"null_arg_expr")), ConstructionWarning);
88 const auto HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr =
90 cxxTemporaryObjectExpr(cxxConstructExpr(
91 HasBasicStringViewType, argumentCountIs(1),
92 hasAnyArgument( anyOf(
93 NullLiteral, NullInitList, EmptyInitList)),
94 has(expr().bind(
"null_arg_expr")))),
95 remove(node(
"null_arg_expr")), ConstructionWarning);
98 const auto HandleTemporaryCStyleCastExpr =
99 makeRule(cStyleCastExpr(hasSourceExpression(
100 BasicStringViewConstructingFromNullExpr)),
101 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
104 const auto HandleTemporaryCXXStaticCastExpr =
105 makeRule(cxxStaticCastExpr(hasSourceExpression(
106 BasicStringViewConstructingFromNullExpr)),
107 changeTo(node(
"null_arg_expr"), cat(
"\"\"")), StaticCastWarning);
110 const auto HandleStackCopyInitialization =
111 makeRule(varDecl(HasBasicStringViewType,
112 hasInitializer(ignoringImpCasts(cxxConstructExpr(
113 BasicStringViewConstructingFromNullExpr,
114 unless(isListInitialization())))),
115 unless(isDirectInitialization())),
116 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
119 const auto HandleStackCopyListInitialization =
120 makeRule(varDecl(HasBasicStringViewType,
121 hasInitializer(cxxConstructExpr(
122 BasicStringViewConstructingFromNullExpr,
123 isListInitialization())),
124 unless(isDirectInitialization())),
125 remove(node(
"null_arg_expr")), ConstructionWarning);
128 const auto HandleStackDirectInitialization =
129 makeRule(varDecl(HasBasicStringViewType,
130 hasInitializer(cxxConstructExpr(
131 BasicStringViewConstructingFromNullExpr,
132 unless(isListInitialization()))),
133 isDirectInitialization())
135 changeTo(node(
"construct_expr"), cat(name(
"var_decl"))),
136 ConstructionWarning);
139 const auto HandleStackDirectListInitialization =
140 makeRule(varDecl(HasBasicStringViewType,
141 hasInitializer(cxxConstructExpr(
142 BasicStringViewConstructingFromNullExpr,
143 isListInitialization())),
144 isDirectInitialization()),
145 remove(node(
"null_arg_expr")), ConstructionWarning);
148 const auto HandleFieldInClassCopyInitialization = makeRule(
149 fieldDecl(HasBasicStringViewType,
150 hasInClassInitializer(ignoringImpCasts(
151 cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
152 unless(isListInitialization()))))),
153 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
157 const auto HandleFieldInClassCopyListAndDirectListInitialization = makeRule(
158 fieldDecl(HasBasicStringViewType,
159 hasInClassInitializer(ignoringImpCasts(
160 cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
161 isListInitialization())))),
162 remove(node(
"null_arg_expr")), ConstructionWarning);
165 const auto HandleConstructorDirectInitialization =
166 makeRule(cxxCtorInitializer(forField(fieldDecl(HasBasicStringViewType)),
167 withInitializer(cxxConstructExpr(
168 BasicStringViewConstructingFromNullExpr,
169 unless(isListInitialization())))),
170 remove(node(
"null_arg_expr")), ConstructionWarning);
173 const auto HandleConstructorDirectListInitialization =
174 makeRule(cxxCtorInitializer(forField(fieldDecl(HasBasicStringViewType)),
175 withInitializer(cxxConstructExpr(
176 BasicStringViewConstructingFromNullExpr,
177 isListInitialization()))),
178 remove(node(
"null_arg_expr")), ConstructionWarning);
181 const auto HandleDefaultArgumentCopyInitialization =
182 makeRule(parmVarDecl(HasBasicStringViewType,
183 hasInitializer(ignoringImpCasts(cxxConstructExpr(
184 BasicStringViewConstructingFromNullExpr,
185 unless(isListInitialization()))))),
186 changeTo(node(
"null_arg_expr"), cat(
"{}")), ConstructionWarning);
189 const auto HandleDefaultArgumentCopyListInitialization =
190 makeRule(parmVarDecl(HasBasicStringViewType,
191 hasInitializer(cxxConstructExpr(
192 BasicStringViewConstructingFromNullExpr,
193 isListInitialization()))),
194 remove(node(
"null_arg_expr")), ConstructionWarning);
197 const auto HandleHeapDirectInitialization = makeRule(
198 cxxNewExpr(has(cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
199 unless(isListInitialization()))),
200 unless(isArray()), unless(hasAnyPlacementArg(anything()))),
201 remove(node(
"null_arg_expr")), ConstructionWarning);
204 const auto HandleHeapDirectListInitialization = makeRule(
205 cxxNewExpr(has(cxxConstructExpr(BasicStringViewConstructingFromNullExpr,
206 isListInitialization())),
207 unless(isArray()), unless(hasAnyPlacementArg(anything()))),
208 remove(node(
"null_arg_expr")), ConstructionWarning);
211 const auto HandleFunctionArgumentInitialization =
212 makeRule(callExpr(hasAnyArgument(ignoringImpCasts(
213 BasicStringViewConstructingFromNullExpr)),
214 unless(cxxOperatorCallExpr())),
215 changeTo(node(
"construct_expr"), cat(
"\"\"")),
216 ArgumentConstructionWarning);
219 const auto HandleAssignment = makeRule(
220 cxxOperatorCallExpr(hasOverloadedOperatorName(
"="),
221 hasRHS(materializeTemporaryExpr(
222 has(BasicStringViewConstructingFromNullExpr)))),
223 changeTo(node(
"construct_expr"), cat(
"{}")), AssignmentWarning);
226 const auto HandleRelativeComparison = makeRule(
227 cxxOperatorCallExpr(hasAnyOverloadedOperatorName(
"<",
"<=",
">",
">="),
228 hasEitherOperand(ignoringImpCasts(
229 BasicStringViewConstructingFromNullExpr))),
230 changeTo(node(
"construct_expr"), cat(
"\"\"")), RelativeComparisonWarning);
233 const auto HandleEmptyEqualityComparison = makeRule(
235 hasOverloadedOperatorName(
"=="),
236 hasOperands(ignoringImpCasts(BasicStringViewConstructingFromNullExpr),
237 traverse(TK_IgnoreUnlessSpelledInSource,
238 expr().bind(
"instance"))))
240 changeTo(node(
"root"), cat(access(
"instance", cat(
"empty")),
"()")),
241 EqualityComparisonWarning);
244 const auto HandleNonEmptyEqualityComparison = makeRule(
246 hasOverloadedOperatorName(
"!="),
247 hasOperands(ignoringImpCasts(BasicStringViewConstructingFromNullExpr),
248 traverse(TK_IgnoreUnlessSpelledInSource,
249 expr().bind(
"instance"))))
251 changeTo(node(
"root"), cat(
"!", access(
"instance", cat(
"empty")),
"()")),
252 EqualityComparisonWarning);
255 const auto HandleReturnStatement = makeRule(
256 returnStmt(hasReturnValue(
257 ignoringImpCasts(BasicStringViewConstructingFromNullExpr))),
258 changeTo(node(
"construct_expr"), cat(
"{}")), ConstructionWarning);
261 const auto HandleConstructorInvocation =
262 makeRule(cxxConstructExpr(
265 BasicStringViewConstructingFromNullExpr)),
266 unless(HasBasicStringViewType)),
267 changeTo(node(
"construct_expr"), cat(
"\"\"")),
268 ArgumentConstructionWarning);
271 {HandleTemporaryCXXFunctionalCastExpr,
272 HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr,
273 HandleTemporaryCStyleCastExpr,
274 HandleTemporaryCXXStaticCastExpr,
275 HandleStackCopyInitialization,
276 HandleStackCopyListInitialization,
277 HandleStackDirectInitialization,
278 HandleStackDirectListInitialization,
279 HandleFieldInClassCopyInitialization,
280 HandleFieldInClassCopyListAndDirectListInitialization,
281 HandleConstructorDirectInitialization,
282 HandleConstructorDirectListInitialization,
283 HandleDefaultArgumentCopyInitialization,
284 HandleDefaultArgumentCopyListInitialization,
285 HandleHeapDirectInitialization,
286 HandleHeapDirectListInitialization,
287 HandleFunctionArgumentInitialization,
289 HandleRelativeComparison,
290 HandleEmptyEqualityComparison,
291 HandleNonEmptyEqualityComparison,
292 HandleReturnStatement,
293 HandleConstructorInvocation});