[PATCH] D84140: [clang] Set the error-bit for ill-formed semantic InitListExpr.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 20 06:41:14 PDT 2020
hokein updated this revision to Diff 279227.
hokein added a comment.
add "ErrorDependent" alias to `ExprDependence` enum.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84140/new/
https://reviews.llvm.org/D84140
Files:
clang-tools-extra/clangd/unittests/HoverTests.cpp
clang/include/clang/AST/DependenceFlags.h
clang/include/clang/AST/Expr.h
clang/lib/AST/ComputeDependence.cpp
clang/lib/Sema/SemaInit.cpp
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -962,6 +962,8 @@
FillInEmptyInitializations(Entity, FullyStructuredList,
RequiresSecondPass, nullptr, 0);
}
+ if (hadError && FullyStructuredList)
+ FullyStructuredList->markError();
}
int InitListChecker::numArrayElements(QualType DeclType) {
Index: clang/lib/AST/ComputeDependence.cpp
===================================================================
--- clang/lib/AST/ComputeDependence.cpp
+++ clang/lib/AST/ComputeDependence.cpp
@@ -502,7 +502,7 @@
// dependent type), or the type is known and dependent, or it has
// type-dependent subexpressions.
auto D = toExprDependence(E->getType()->getDependence()) |
- ExprDependence::ValueInstantiation | ExprDependence::Error;
+ ExprDependence::ErrorDependent;
// FIXME: remove the type-dependent bit from subexpressions, if the
// RecoveryExpr has a non-dependent type.
for (auto *S : E->subExpressions())
Index: clang/include/clang/AST/Expr.h
===================================================================
--- clang/include/clang/AST/Expr.h
+++ clang/include/clang/AST/Expr.h
@@ -4690,6 +4690,13 @@
setDependence(getDependence() | expr->getDependence());
}
+ /// Mark the semantic form of the InitListExpr as error when the semantic
+ /// analysis fails.
+ void markError() {
+ assert(isSemanticForm());
+ setDependence(getDependence() | ExprDependence::ErrorDependent);
+ }
+
/// Reserve space for some number of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits);
Index: clang/include/clang/AST/DependenceFlags.h
===================================================================
--- clang/include/clang/AST/DependenceFlags.h
+++ clang/include/clang/AST/DependenceFlags.h
@@ -41,6 +41,7 @@
TypeInstantiation = Type | Instantiation,
ValueInstantiation = Value | Instantiation,
TypeValueInstantiation = Type | Value | Instantiation,
+ ErrorDependent = Error | ValueInstantiation,
LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Error)
};
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -957,6 +957,16 @@
template <typename T> void foo() {
(void)[[size^of]](T);
})cpp",
+ R"cpp(// should not crash on invalid semantic form of init-list-expr.
+ /*error-ok*/
+ struct Foo {
+ int xyz = 0;
+ };
+ class Bar {};
+ constexpr Foo s = ^{
+ .xyz = Bar(),
+ };
+ )cpp",
// literals
"auto x = t^rue;",
"auto x = '^A';",
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84140.279227.patch
Type: text/x-patch
Size: 2958 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200720/d12c94a2/attachment-0001.bin>
More information about the cfe-commits
mailing list