Skip to content

Commit 3fa0a03

Browse files
committed
[clang] Check expr inside InitListChecker::UpdateStructuredListElement()
- Prevent nullptr-deference at try to emit warning for invalid `expr` - Simplify `InitListChecker::UpdateStructuredListElement()` usages. We do not need to check `expr` and increment `StructuredIndex` (for invalid `expr`) before the call anymore. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D85193
1 parent d6f0600 commit 3fa0a03

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

clang/lib/Sema/SemaInit.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,10 +1585,7 @@ void InitListChecker::CheckScalarType(const InitializedEntity &Entity,
15851585
IList->setInit(Index, ResultExpr);
15861586
}
15871587
}
1588-
if (hadError)
1589-
++StructuredIndex;
1590-
else
1591-
UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1588+
UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
15921589
++Index;
15931590
}
15941591

@@ -1643,10 +1640,7 @@ void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
16431640
if (!VerifyOnly && expr)
16441641
IList->setInit(Index, expr);
16451642

1646-
if (hadError)
1647-
++StructuredIndex;
1648-
else
1649-
UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1643+
UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
16501644
++Index;
16511645
}
16521646

@@ -1697,11 +1691,7 @@ void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
16971691
IList->setInit(Index, ResultExpr);
16981692
}
16991693
}
1700-
if (hadError)
1701-
++StructuredIndex;
1702-
else
1703-
UpdateStructuredListElement(StructuredList, StructuredIndex,
1704-
ResultExpr);
1694+
UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
17051695
++Index;
17061696
return;
17071697
}
@@ -3100,8 +3090,12 @@ void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
31003090

31013091
if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
31023092
StructuredIndex, expr)) {
3103-
// This initializer overwrites a previous initializer. Warn.
3104-
diagnoseInitOverride(PrevInit, expr->getSourceRange());
3093+
// This initializer overwrites a previous initializer.
3094+
// No need to diagnose when `expr` is nullptr because a more relevant
3095+
// diagnostic has already been issued and this diagnostic is potentially
3096+
// noise.
3097+
if (expr)
3098+
diagnoseInitOverride(PrevInit, expr->getSourceRange());
31053099
}
31063100

31073101
++StructuredIndex;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %clang_cc1 %s -verify -fsyntax-only
2+
3+
struct S {
4+
Unknown u; // expected-error {{unknown type name 'Unknown'}}
5+
int i;
6+
};
7+
// Should not crash
8+
struct S s[] = {[0].i = 0, [1].i = 1, {}};

0 commit comments

Comments
 (0)