@@ -260,37 +260,29 @@ static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
260260 diag::ext_initializer_string_for_char_array_too_long)
261261 << Str->getSourceRange ();
262262 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 ();
283285
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- }
294286 // Always emit the C++ compatibility diagnostic.
295287 S.Diag (Str->getBeginLoc (),
296288 diag::warn_initializer_string_for_char_array_too_long_for_cpp)
0 commit comments