Author: Haojian Wu Date: 2020-03-24T15:17:04+01:00 New Revision: 386f95e168b09603595864a5956624792ccb59c4
URL: https://github.com/llvm/llvm-project/commit/386f95e168b09603595864a5956624792ccb59c4 DIFF: https://github.com/llvm/llvm-project/commit/386f95e168b09603595864a5956624792ccb59c4.diff LOG: [Parser] Fix the assertion crash in ActOnStartOfSwitch stmt. Summary: After we parse the switch condition, we don't do the type check for type-dependent expr (e.g. TypoExpr) (in Sema::CheckSwitchCondition), then the TypoExpr is corrected to an invalid-type expr (in Sema::MakeFullExpr) and passed to the ActOnStartOfSwitchStmt, which triggers the assertion. Fix https://github.com/clangd/clangd/issues/311 Reviewers: sammccall Subscribers: ilya-biryukov, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D76592 Added: clang/test/Parser/switch-typo-correction.cpp Modified: clang/lib/Sema/SemaStmt.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 2104add400e0..68de776e83e6 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -730,11 +730,11 @@ StmtResult Sema::ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, if (CondExpr && !CondExpr->isTypeDependent()) { // We have already converted the expression to an integral or enumeration - // type, when we parsed the switch condition. If we don't have an - // appropriate type now, enter the switch scope but remember that it's - // invalid. - assert(CondExpr->getType()->isIntegralOrEnumerationType() && - "invalid condition type"); + // type, when we parsed the switch condition. There are cases where we don't + // have an appropriate type, e.g. a typo-expr Cond was corrected to an + // inappropriate-type expr, we just return an error. + if (!CondExpr->getType()->isIntegralOrEnumerationType()) + return StmtError(); if (CondExpr->isKnownToHaveBooleanValue()) { // switch(bool_expr) {...} is often a programmer error, e.g. // switch(n && mask) { ... } // Doh - should be "n & mask". diff --git a/clang/test/Parser/switch-typo-correction.cpp b/clang/test/Parser/switch-typo-correction.cpp new file mode 100644 index 000000000000..ebf1c18f2b86 --- /dev/null +++ b/clang/test/Parser/switch-typo-correction.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +namespace c { double xxx; } // expected-note{{'c::xxx' declared here}} +namespace d { float xxx; } +namespace z { namespace xxx {} } + +void crash() { + switch (xxx) {} // expected-error{{use of undeclared identifier 'xxx'; did you mean }} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits