Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Clang] crash inside clang::Sema::Diag() at delayed typos correction #61326

Closed
ArcsinX opened this issue Mar 10, 2023 · 1 comment
Closed

[Clang] crash inside clang::Sema::Diag() at delayed typos correction #61326

ArcsinX opened this issue Mar 10, 2023 · 1 comment
Labels
clang:diagnostics New/improved warning or error message in Clang, but not in clang-tidy or static analyzer confirmed Verified by a second party crash-on-invalid

Comments

@ArcsinX
Copy link
Contributor

ArcsinX commented Mar 10, 2023

Code

#include <utility>

template <typename... T>
void foo(T &&...Params) {
  std::forward<T>(Unknown);
  ((std::forward<T>(Unknown)), ...);
}

Output

1.cpp:5:3: error: expression contains unexpanded parameter pack 'T'
  std::forward<T>(Unknown);
  ^            ~
1.cpp:6:21: error: use of undeclared identifier 'Unknown'
  ((std::forward<T>(Unknown)), ...);
                    ^

Stack dump:
0.      Program arguments: bin/clang 1.cpp -c
1.      1.cpp:7:1: current parser token '}'
2.      1.cpp:4:25: parsing function body 'foo'
3.      1.cpp:4:25: in compound statement ('{}')
 #0 0x00005624eeb2609f PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x00005624eeb23d14 llvm::sys::CleanupOnSignal(unsigned long) (bin/clang+0x1f3ed14)
 #2 0x00005624eea8c7e8 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f88b86dc980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #4 0x00005624f0a9a487 clang::Sema::Diag(clang::SourceLocation, unsigned int, bool) (bin/clang+0x3eb5487)
 #5 0x00005624f0d75e10 emitEmptyLookupTypoDiagnostic(clang::TypoCorrection const&, clang::Sema&, clang::CXXScopeSpec const&, clang::DeclarationName, clang::SourceLocation, llvm::ArrayRef<clang::Expr*>, unsigned int, unsigned int) (.isra.11513) SemaExpr.cpp:0:0
 #6 0x00005624f0d76379 std::_Function_handler<void (clang::TypoCorrection const&), clang::Sema::DiagnoseEmptyLookup(clang::Scope*, clang::CXXScopeSpec&, clang::LookupResult&, clang::CorrectionCandidateCallback&, clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>, clang::TypoExpr**)::'lambda'(clang::TypoCorrection const&)>::_M_invoke(std::_Any_data const&, clang::TypoCorrection const&) SemaExpr.cpp:0:0
 #7 0x00005624f0eb557f clang::Sema::CorrectDelayedTyposInExpr(clang::Expr*, clang::VarDecl*, bool, llvm::function_ref<clang::ActionResult<clang::Expr*, true> (clang::Expr*)>) (bin/clang+0x42d057f)
 #8 0x00005624f0eb6ca1 clang::Sema::ActOnFinishFullExpr(clang::Expr*, clang::SourceLocation, bool, bool, bool) (bin/clang+0x42d1ca1)
 #9 0x00005624f10bbf8f clang::Sema::ActOnExprStmt(clang::ActionResult<clang::Expr*, true>, bool) (bin/clang+0x44d6f8f)
#10 0x00005624f0a2f614 clang::Parser::ParseExprStatement(clang::Parser::ParsedStmtContext) (bin/clang+0x3e4a614)
#11 0x00005624f0a2572a clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::ParsedAttributes&, clang::ParsedAttributes&) (bin/clang+0x3e4072a)
#12 0x00005624f0a260df clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) (bin/clang+0x3e410df)
#13 0x00005624f0a26fe5 clang::Parser::ParseCompoundStatementBody(bool) (bin/clang+0x3e41fe5)
#14 0x00005624f0a27793 clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) (bin/clang+0x3e42793)
#15 0x00005624f096bfff clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) (bin/clang+0x3d86fff)
#16 0x00005624f0a42dab clang::Parser::ParseSingleDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (bin/clang+0x3e5ddab)
#17 0x00005624f0a4af30 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (bin/clang+0x3e65f30)
#18 0x00005624f0a4b216 clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (bin/clang+0x3e66216)
#19 0x00005624f0997500 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) (bin/clang+0x3db2500)
#20 0x00005624f096dbde clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (bin/clang+0x3d88bde)
#21 0x00005624f096f3fa clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (bin/clang+0x3d8a3fa)
#22 0x00005624f09619aa clang::ParseAST(clang::Sema&, bool, bool) (bin/clang+0x3d7c9aa)
#23 0x00005624efb87815 clang::CodeGenAction::ExecuteAction() (bin/clang+0x2fa2815)
#24 0x00005624ef5633b1 clang::FrontendAction::Execute() (bin/clang+0x297e3b1)
#25 0x00005624ef4f40ca clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (bin/clang+0x290f0ca)
#26 0x00005624ef631c3b clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (bin/clang+0x2a4cc3b)
#27 0x00005624ed99872c cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (bin/clang+0xdb372c)
#28 0x00005624ed993965 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#29 0x00005624ef372819 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#30 0x00005624eea8cc23 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (bin/clang+0x1ea7c23)
#31 0x00005624ef373271 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.275) Job.cpp:0:0
#32 0x00005624ef340388 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (bin/clang+0x275b388)
#33 0x00005624ef340d83 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (bin/clang+0x275bd83)
#34 0x00005624ef3485ac clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (bin/clang+0x27635ac)
#35 0x00005624ed996d17 clang_main(int, char**, llvm::ToolContext const&) (bin/clang+0xdb1d17)
#36 0x00005624ed90e701 main (bin/clang+0xd29701)
#37 0x00007f88b7370c87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#38 0x00005624ed98fc8a _start (bin/clang+0xdaac8a)
clang: error: clang frontend command failed with exit code 139 (use -v to see invocation)
clang version 17.0.0 (https://github.com/llvm/llvm-project.git 01487f384a1eeb664bc6803cc996054f838eda95)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /llvm-project/build/bin
@ArcsinX ArcsinX added clang Clang issues not falling into any other category crash-on-invalid crash Prefer [crash-on-valid] or [crash-on-invalid] labels Mar 10, 2023
@EugeneZelenko EugeneZelenko added clang:diagnostics New/improved warning or error message in Clang, but not in clang-tidy or static analyzer and removed clang Clang issues not falling into any other category crash Prefer [crash-on-valid] or [crash-on-invalid] labels Mar 10, 2023
@shafik shafik added the confirmed Verified by a second party label Mar 11, 2023
@HerrCai0907
Copy link
Contributor

Candidate patch: https://reviews.llvm.org/D145892

HerrCai0907 added a commit that referenced this issue Mar 14, 2023
…Diag

PR #61326

- fix clang crash when fold expression contains a delayed typos correction.

code snippet in `ActOnCXXFoldExpr`
```  if (!LHS || !RHS) {
    Expr *Pack = LHS ? LHS : RHS;
    assert(Pack && "fold expression with neither LHS nor RHS");
    DiscardOperands();
    if (!Pack->containsUnexpandedParameterPack())
      return Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
             << Pack->getSourceRange();
  }
```
`DiscardOperands` will be triggered when LHS/RHS is delayed typo correction expression.
It will output and clean all diagnose but still return a valid expression. (in else branch)
valid expression will be handled in caller function. When caller wants to output the diagnose, the diagnose in delayed typo correction expression has been consumed in `ActOnCXXFoldExpr`. It causes clang crash.

Reviewed By: erichkeane

Differential Revision: https://reviews.llvm.org/D145892
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:diagnostics New/improved warning or error message in Clang, but not in clang-tidy or static analyzer confirmed Verified by a second party crash-on-invalid
Projects
None yet
Development

No branches or pull requests

4 participants