@@ -260,37 +260,29 @@ static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
260
260
diag::ext_initializer_string_for_char_array_too_long)
261
261
<< Str->getSourceRange ();
262
262
else if (StrLength - 1 == ArrayLen) {
263
- // In C, if the string literal is null-terminated explicitly, e.g., `char
264
- // a[4] = "ABC\0"`, there should be no warning:
265
- const auto *SL = dyn_cast<StringLiteral>(Str->IgnoreParens ());
266
- bool IsSLSafe = SL && SL->getLength () > 0 &&
267
- SL->getCodeUnit (SL->getLength () - 1 ) == 0 ;
268
-
269
- if (!IsSLSafe) {
270
- // If the entity being initialized has the nonstring attribute, then
271
- // silence the "missing nonstring" diagnostic. If there's no entity,
272
- // check whether we're initializing an array of arrays; if so, walk the
273
- // parents to find an entity.
274
- auto FindCorrectEntity =
275
- [](const InitializedEntity *Entity) -> const ValueDecl * {
276
- while (Entity) {
277
- if (const ValueDecl *VD = Entity->getDecl ())
278
- return VD;
279
- if (!Entity->getType ()->isArrayType ())
280
- return nullptr ;
281
- Entity = Entity->getParent ();
282
- }
263
+ // If the entity being initialized has the nonstring attribute, then
264
+ // silence the "missing nonstring" diagnostic. If there's no entity,
265
+ // check whether we're initializing an array of arrays; if so, walk the
266
+ // parents to find an entity.
267
+ auto FindCorrectEntity =
268
+ [](const InitializedEntity *Entity) -> const ValueDecl * {
269
+ while (Entity) {
270
+ if (const ValueDecl *VD = Entity->getDecl ())
271
+ return VD;
272
+ if (!Entity->getType ()->isArrayType ())
273
+ return nullptr ;
274
+ Entity = Entity->getParent ();
275
+ }
276
+
277
+ return nullptr ;
278
+ };
279
+ if (const ValueDecl *D = FindCorrectEntity (&Entity);
280
+ !D || !D->hasAttr <NonStringAttr>())
281
+ S.Diag (
282
+ Str->getBeginLoc (),
283
+ diag::warn_initializer_string_for_char_array_too_long_no_nonstring)
284
+ << ArrayLen << StrLength << Str->getSourceRange ();
283
285
284
- return nullptr ;
285
- };
286
- if (const ValueDecl *D = FindCorrectEntity (&Entity);
287
- !D || !D->hasAttr <NonStringAttr>())
288
- S.Diag (
289
- Str->getBeginLoc (),
290
- diag::
291
- warn_initializer_string_for_char_array_too_long_no_nonstring)
292
- << ArrayLen << StrLength << Str->getSourceRange ();
293
- }
294
286
// Always emit the C++ compatibility diagnostic.
295
287
S.Diag (Str->getBeginLoc (),
296
288
diag::warn_initializer_string_for_char_array_too_long_for_cpp)
0 commit comments