[PATCH] D129499: [clang] Do not crash on "requires" after a fatal error occurred.
Adam Czachorowski via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 13 09:44:24 PDT 2022
adamcz updated this revision to Diff 444315.
adamcz added a comment.
improved the test
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129499/new/
https://reviews.llvm.org/D129499
Files:
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/concept-fatal-error.cpp
Index: clang/test/SemaCXX/concept-fatal-error.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/concept-fatal-error.cpp
@@ -0,0 +1,10 @@
+// RUN: not %clang_cc1 -fsyntax-only -std=c++20 -ferror-limit 1 -verify %s
+
+template <class>
+concept f = requires { 42; };
+struct h {
+ // The missing semicolon will trigger an error and -ferror-limit=1 will make it fatal
+ // We test that we do not crash in such cases (#55401)
+ int i = requires { { i } f } // expected-error {{expected ';' at end of declaration list}}
+ // expected-error@* {{too many errros emitted}}
+};
Index: clang/lib/Sema/SemaExprCXX.cpp
===================================================================
--- clang/lib/Sema/SemaExprCXX.cpp
+++ clang/lib/Sema/SemaExprCXX.cpp
@@ -9006,14 +9006,14 @@
cast<TemplateTypeParmDecl>(TPL->getParam(0))->getTypeConstraint()
->getImmediatelyDeclaredConstraint();
ExprResult Constraint = SubstExpr(IDC, MLTAL);
- assert(!Constraint.isInvalid() &&
- "Substitution cannot fail as it is simply putting a type template "
- "argument into a concept specialization expression's parameter.");
-
- SubstitutedConstraintExpr =
- cast<ConceptSpecializationExpr>(Constraint.get());
- if (!SubstitutedConstraintExpr->isSatisfied())
- Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied;
+ if (Constraint.isInvalid()) {
+ Status = concepts::ExprRequirement::SS_ExprSubstitutionFailure;
+ } else {
+ SubstitutedConstraintExpr =
+ cast<ConceptSpecializationExpr>(Constraint.get());
+ if (!SubstitutedConstraintExpr->isSatisfied())
+ Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied;
+ }
}
return new (Context) concepts::ExprRequirement(E, IsSimple, NoexceptLoc,
ReturnTypeRequirement, Status,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129499.444315.patch
Type: text/x-patch
Size: 1967 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220713/7c547030/attachment.bin>
More information about the cfe-commits
mailing list