[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 00:53:29 PDT 2020
hokein created this revision.
hokein added a reviewer: sammccall.
Herald added subscribers: kbobyrev, usaxena95, kadircet, arphaman, jkorous.
Herald added a project: clang.
When a semantic checking fails on a syntactic InitListExpr, we will
get an ill-formed semantic InitListExpr (e.g. some inits are nullptr),
using this semantic InitListExpr in clang (without setting the err-bits) is crashy.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D84140
Files:
clang-tools-extra/clangd/unittests/HoverTests.cpp
clang/include/clang/AST/Expr.h
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/include/clang/AST/Expr.h
===================================================================
--- clang/include/clang/AST/Expr.h
+++ clang/include/clang/AST/Expr.h
@@ -4690,6 +4690,14 @@
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::Error |
+ ExprDependence::ValueInstantiation);
+ }
+
/// Reserve space for some number of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits);
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.279138.patch
Type: text/x-patch
Size: 1851 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200720/6f5c5df9/attachment.bin>
More information about the cfe-commits
mailing list