llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: FantasqueX (FantasqueX) <details> <summary>Changes</summary> C++17 supports `if constexpr` statement. This patch implements this in code completion. --- Full diff: https://github.com/llvm/llvm-project/pull/124315.diff 3 Files Affected: - (modified) clang/include/clang/Sema/SemaCodeCompletion.h (+1) - (modified) clang/lib/Parse/ParseStmt.cpp (+8) - (modified) clang/lib/Sema/SemaCodeComplete.cpp (+15) ``````````diff diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h index e931596c215d31..af44745d5d1239 100644 --- a/clang/include/clang/Sema/SemaCodeCompletion.h +++ b/clang/include/clang/Sema/SemaCodeCompletion.h @@ -152,6 +152,7 @@ class SemaCodeCompletion : public SemaBase { void CodeCompleteDesignator(const QualType BaseType, llvm::ArrayRef<Expr *> InitExprs, const Designation &D); + void CodeCompleteIfConstExpr(Scope *S) const; void CodeCompleteAfterIf(Scope *S, bool IsBracedThen); void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext, diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index cd4504630f8719..3f9900dd997ada 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -1553,6 +1553,14 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) { IsConsteval = true; ConstevalLoc = ConsumeToken(); } + + if (Tok.is(tok::code_completion)) { + if (getLangOpts().CPlusPlus17) { + cutOffParsing(); + Actions.CodeCompletion().CodeCompleteIfConstExpr(getCurScope()); + return StmtError(); + } + } } if (!IsConsteval && (NotLocation.isValid() || Tok.isNot(tok::l_paren))) { Diag(Tok, diag::err_expected_lparen_after) << "if"; diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 58f3efbe0daf89..b159fd26a45208 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -6762,6 +6762,21 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) { CodeCompleteExpression(S, Data); } +void SemaCodeCompletion::CodeCompleteIfConstExpr(Scope *S) const { + ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(), + CodeCompleter->getCodeCompletionTUInfo(), + CodeCompletionContext::CCC_SymbolOrNewName); + Results.EnterNewScope(); + + Results.AddResult(CodeCompletionResult("constexpr")); + + Results.ExitScope(); + + HandleCodeCompleteResults(&SemaRef, CodeCompleter, + Results.getCompletionContext(), Results.data(), + Results.size()); +} + void SemaCodeCompletion::CodeCompleteAfterIf(Scope *S, bool IsBracedThen) { ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(), CodeCompleter->getCodeCompletionTUInfo(), `````````` </details> https://github.com/llvm/llvm-project/pull/124315 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits