[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)
Letu Ren via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 7 08:52:03 PST 2025
https://github.com/FantasqueX updated https://github.com/llvm/llvm-project/pull/124315
>From f186c52e78c26db93cc37d858d088259cd3029a1 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/10] [Sema] Add code completion for if constexpr
C++17 supports `if constexpr` statement. This patch implements this in
code completion.
---
clang/include/clang/Sema/SemaCodeCompletion.h | 1 +
clang/lib/Parse/ParseStmt.cpp | 8 ++++++++
clang/lib/Sema/SemaCodeComplete.cpp | 15 +++++++++++++++
3 files changed, 24 insertions(+)
diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h
index e931596c215d3..af44745d5d123 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 cd4504630f871..3f9900dd997ad 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 db467d76b5d32..1a893c866a911 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6749,6 +6749,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(),
>From 97c875dc554177d1d78db62dd039181ed6cfb71f Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/10] Add test for if constexpr completion
---
clang/test/CodeCompletion/if-constexpr.cpp | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 clang/test/CodeCompletion/if-constexpr.cpp
diff --git a/clang/test/CodeCompletion/if-constexpr.cpp b/clang/test/CodeCompletion/if-constexpr.cpp
new file mode 100644
index 0000000000000..48a89b4799cbc
--- /dev/null
+++ b/clang/test/CodeCompletion/if-constexpr.cpp
@@ -0,0 +1,4 @@
+void test() {
+ if c
+ // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:%(line-1):7 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
+ // CHECK-CC1: constexpr
>From dc2bc994477e2ce350f26ae02e8701f9b09c880f Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/10] rename function
---
clang/include/clang/Sema/SemaCodeCompletion.h | 2 +-
clang/lib/Parse/ParseStmt.cpp | 2 +-
clang/lib/Sema/SemaCodeComplete.cpp | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h
index af44745d5d123..c79e6ec13634b 100644
--- a/clang/include/clang/Sema/SemaCodeCompletion.h
+++ b/clang/include/clang/Sema/SemaCodeCompletion.h
@@ -152,7 +152,7 @@ class SemaCodeCompletion : public SemaBase {
void CodeCompleteDesignator(const QualType BaseType,
llvm::ArrayRef<Expr *> InitExprs,
const Designation &D);
- void CodeCompleteIfConstExpr(Scope *S) const;
+ 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 3f9900dd997ad..fd7f707d87516 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -1557,7 +1557,7 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
if (Tok.is(tok::code_completion)) {
if (getLangOpts().CPlusPlus17) {
cutOffParsing();
- Actions.CodeCompletion().CodeCompleteIfConstExpr(getCurScope());
+ Actions.CodeCompletion().CodeCompleteIfConstexpr(getCurScope());
return StmtError();
}
}
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 1a893c866a911..53ad888d0d791 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6749,7 +6749,7 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
CodeCompleteExpression(S, Data);
}
-void SemaCodeCompletion::CodeCompleteIfConstExpr(Scope *S) const {
+void SemaCodeCompletion::CodeCompleteIfConstexpr(Scope *S) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
CodeCompletionContext::CCC_SymbolOrNewName);
>From 7dbcbe5b4017302f9dac05b6d38a3af0423a5dd1 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Sat, 15 Feb 2025 19:10:02 +0800
Subject: [PATCH 04/10] use CCC_Other instead
---
clang/lib/Sema/SemaCodeComplete.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 53ad888d0d791..d402c577d22c8 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6752,11 +6752,9 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
void SemaCodeCompletion::CodeCompleteIfConstexpr(Scope *S) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
- CodeCompletionContext::CCC_SymbolOrNewName);
+ CodeCompletionContext::CCC_Other);
Results.EnterNewScope();
-
Results.AddResult(CodeCompletionResult("constexpr"));
-
Results.ExitScope();
HandleCodeCompleteResults(&SemaRef, CodeCompleter,
>From 3b3d4af3fda58558b35b886c4e1becd336875213 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Mon, 17 Feb 2025 20:48:22 +0800
Subject: [PATCH 05/10] Add consteval
---
clang/include/clang/Sema/SemaCodeCompletion.h | 2 +-
clang/lib/Parse/ParseStmt.cpp | 8 +++-----
clang/lib/Sema/SemaCodeComplete.cpp | 9 +++++++--
clang/test/CodeCompletion/if-const.cpp | 6 ++++++
clang/test/CodeCompletion/if-constexpr.cpp | 4 ----
5 files changed, 17 insertions(+), 12 deletions(-)
create mode 100644 clang/test/CodeCompletion/if-const.cpp
delete mode 100644 clang/test/CodeCompletion/if-constexpr.cpp
diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h
index c79e6ec13634b..b930210f5f905 100644
--- a/clang/include/clang/Sema/SemaCodeCompletion.h
+++ b/clang/include/clang/Sema/SemaCodeCompletion.h
@@ -152,7 +152,7 @@ class SemaCodeCompletion : public SemaBase {
void CodeCompleteDesignator(const QualType BaseType,
llvm::ArrayRef<Expr *> InitExprs,
const Designation &D);
- void CodeCompleteIfConstexpr(Scope *S) const;
+ void CodeCompleteIfConst(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 fd7f707d87516..1c83697a4f421 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -1555,11 +1555,9 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
}
if (Tok.is(tok::code_completion)) {
- if (getLangOpts().CPlusPlus17) {
- cutOffParsing();
- Actions.CodeCompletion().CodeCompleteIfConstexpr(getCurScope());
- return StmtError();
- }
+ cutOffParsing();
+ Actions.CodeCompletion().CodeCompleteIfConst(getCurScope());
+ return StmtError();
}
}
if (!IsConsteval && (NotLocation.isValid() || Tok.isNot(tok::l_paren))) {
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index d402c577d22c8..5ef59b4e333a4 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6749,12 +6749,17 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
CodeCompleteExpression(S, Data);
}
-void SemaCodeCompletion::CodeCompleteIfConstexpr(Scope *S) const {
+void SemaCodeCompletion::CodeCompleteIfConst(Scope *S) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
CodeCompletionContext::CCC_Other);
Results.EnterNewScope();
- Results.AddResult(CodeCompletionResult("constexpr"));
+ if (getLangOpts().CPlusPlus17) {
+ Results.AddResult(CodeCompletionResult("constexpr"));
+ }
+ if (getLangOpts().CPlusPlus23) {
+ Results.AddResult(CodeCompletionResult("consteval"));
+ }
Results.ExitScope();
HandleCodeCompleteResults(&SemaRef, CodeCompleter,
diff --git a/clang/test/CodeCompletion/if-const.cpp b/clang/test/CodeCompletion/if-const.cpp
new file mode 100644
index 0000000000000..3c795dcc00ab9
--- /dev/null
+++ b/clang/test/CodeCompletion/if-const.cpp
@@ -0,0 +1,6 @@
+void test() {
+ if c
+ // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:2:7 %s -o - | FileCheck -check-prefix=CHECK-CXX17 %s
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:2:7 %s -o - | FileCheck -check-prefix=CHECK-CXX23 %s
+ // CHECK-CXX17: constexpr
+ // CHECK-CXX23: consteval
diff --git a/clang/test/CodeCompletion/if-constexpr.cpp b/clang/test/CodeCompletion/if-constexpr.cpp
deleted file mode 100644
index 48a89b4799cbc..0000000000000
--- a/clang/test/CodeCompletion/if-constexpr.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-void test() {
- if c
- // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:%(line-1):7 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
- // CHECK-CC1: constexpr
>From a1d21235bc1b6b4baadbe83c7ce91de84a7ac218 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Mon, 24 Feb 2025 01:20:45 +0800
Subject: [PATCH 06/10] support code snippet completion
---
clang/lib/Sema/SemaCodeComplete.cpp | 31 +++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 5ef59b4e333a4..95ba8b936038c 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6753,12 +6753,39 @@ void SemaCodeCompletion::CodeCompleteIfConst(Scope *S) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
CodeCompletionContext::CCC_Other);
+ CodeCompletionBuilder Builder(Results.getAllocator(), Results.getCodeCompletionTUInfo());
Results.EnterNewScope();
if (getLangOpts().CPlusPlus17) {
- Results.AddResult(CodeCompletionResult("constexpr"));
+ if (Results.includeCodePatterns()) {
+ Builder.AddTypedTextChunk("constexpr");
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_LeftParen);
+ Builder.AddPlaceholderChunk("condition");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
+ Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
+ Builder.AddPlaceholderChunk("statements");
+ Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_RightBrace);
+ Results.AddResult({Builder.TakeString()});
+ } else {
+ Results.AddResult({"constexpr"});
+ }
}
if (getLangOpts().CPlusPlus23) {
- Results.AddResult(CodeCompletionResult("consteval"));
+ if (Results.includeCodePatterns()) {
+ Builder.AddTypedTextChunk("consteval");
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
+ Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
+ Builder.AddPlaceholderChunk("statements");
+ Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_RightBrace);
+ Results.AddResult({Builder.TakeString()});
+ } else {
+ Results.AddResult({"consteval"});
+ }
}
Results.ExitScope();
>From 2597d8ec677b105cabb5514616cd53d569baf99d Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Mon, 24 Feb 2025 01:25:58 +0800
Subject: [PATCH 07/10] format code
---
clang/lib/Sema/SemaCodeComplete.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 95ba8b936038c..3e294e066bce4 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6753,7 +6753,8 @@ void SemaCodeCompletion::CodeCompleteIfConst(Scope *S) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
CodeCompletionContext::CCC_Other);
- CodeCompletionBuilder Builder(Results.getAllocator(), Results.getCodeCompletionTUInfo());
+ CodeCompletionBuilder Builder(Results.getAllocator(),
+ Results.getCodeCompletionTUInfo());
Results.EnterNewScope();
if (getLangOpts().CPlusPlus17) {
if (Results.includeCodePatterns()) {
>From 3d89bc08d089aaea717351071185cca736e995da Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Tue, 25 Feb 2025 14:12:28 +0800
Subject: [PATCH 08/10] Add if not test
---
clang/include/clang/Sema/SemaCodeCompletion.h | 2 +-
clang/lib/Parse/ParseStmt.cpp | 2 +-
clang/lib/Sema/SemaCodeComplete.cpp | 34 ++++++++++---------
clang/test/CodeCompletion/if-const.cpp | 13 +++++--
4 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h
index b930210f5f905..66a621f684d81 100644
--- a/clang/include/clang/Sema/SemaCodeCompletion.h
+++ b/clang/include/clang/Sema/SemaCodeCompletion.h
@@ -152,7 +152,7 @@ class SemaCodeCompletion : public SemaBase {
void CodeCompleteDesignator(const QualType BaseType,
llvm::ArrayRef<Expr *> InitExprs,
const Designation &D);
- void CodeCompleteIfConst(Scope *S) const;
+ void CodeCompleteIfConst(Scope *S, bool AfterExclaim) 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 1c83697a4f421..2b41552efe8f8 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -1556,7 +1556,7 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
if (Tok.is(tok::code_completion)) {
cutOffParsing();
- Actions.CodeCompletion().CodeCompleteIfConst(getCurScope());
+ Actions.CodeCompletion().CodeCompleteIfConst(getCurScope(), NotLocation.isValid());
return StmtError();
}
}
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 3e294e066bce4..fe812b6e2b4d4 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6749,7 +6749,7 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
CodeCompleteExpression(S, Data);
}
-void SemaCodeCompletion::CodeCompleteIfConst(Scope *S) const {
+void SemaCodeCompletion::CodeCompleteIfConst(Scope *S, bool AfterExclaim) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
CodeCompletionContext::CCC_Other);
@@ -6757,21 +6757,23 @@ void SemaCodeCompletion::CodeCompleteIfConst(Scope *S) const {
Results.getCodeCompletionTUInfo());
Results.EnterNewScope();
if (getLangOpts().CPlusPlus17) {
- if (Results.includeCodePatterns()) {
- Builder.AddTypedTextChunk("constexpr");
- Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
- Builder.AddChunk(CodeCompletionString::CK_LeftParen);
- Builder.AddPlaceholderChunk("condition");
- Builder.AddChunk(CodeCompletionString::CK_RightParen);
- Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
- Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
- Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
- Builder.AddPlaceholderChunk("statements");
- Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
- Builder.AddChunk(CodeCompletionString::CK_RightBrace);
- Results.AddResult({Builder.TakeString()});
- } else {
- Results.AddResult({"constexpr"});
+ if (!AfterExclaim) {
+ if (Results.includeCodePatterns()) {
+ Builder.AddTypedTextChunk("constexpr");
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_LeftParen);
+ Builder.AddPlaceholderChunk("condition");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_LeftBrace);
+ Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
+ Builder.AddPlaceholderChunk("statements");
+ Builder.AddChunk(CodeCompletionString::CK_VerticalSpace);
+ Builder.AddChunk(CodeCompletionString::CK_RightBrace);
+ Results.AddResult({Builder.TakeString()});
+ } else {
+ Results.AddResult({"constexpr"});
+ }
}
}
if (getLangOpts().CPlusPlus23) {
diff --git a/clang/test/CodeCompletion/if-const.cpp b/clang/test/CodeCompletion/if-const.cpp
index 3c795dcc00ab9..82311ce437321 100644
--- a/clang/test/CodeCompletion/if-const.cpp
+++ b/clang/test/CodeCompletion/if-const.cpp
@@ -1,6 +1,13 @@
+template <bool Flag>
void test() {
- if c
- // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:2:7 %s -o - | FileCheck -check-prefix=CHECK-CXX17 %s
- // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:2:7 %s -o - | FileCheck -check-prefix=CHECK-CXX23 %s
+ if constexpr (Flag) {
+ return;
+ }
+ // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:3:7 %s -o - | FileCheck -check-prefix=CHECK-CXX17 %s
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:3:7 %s -o - | FileCheck -check-prefix=CHECK-CXX23 %s
// CHECK-CXX17: constexpr
// CHECK-CXX23: consteval
+ if !c
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:10:8 %s -o - | FileCheck -check-prefix=CHECK-CXX23-NOT %s
+ // CHECK-CXX23-NOT: consteval
+}
>From 3ae3fa01acbfd5a7026e744aafd3b0972eda49fa Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Tue, 25 Feb 2025 14:12:58 +0800
Subject: [PATCH 09/10] format code
---
clang/lib/Parse/ParseStmt.cpp | 3 ++-
clang/lib/Sema/SemaCodeComplete.cpp | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index 2b41552efe8f8..244a6e2f0a6a6 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -1556,7 +1556,8 @@ StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
if (Tok.is(tok::code_completion)) {
cutOffParsing();
- Actions.CodeCompletion().CodeCompleteIfConst(getCurScope(), NotLocation.isValid());
+ Actions.CodeCompletion().CodeCompleteIfConst(getCurScope(),
+ NotLocation.isValid());
return StmtError();
}
}
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index fe812b6e2b4d4..112d08e212274 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6749,7 +6749,8 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope *S, Decl *D) {
CodeCompleteExpression(S, Data);
}
-void SemaCodeCompletion::CodeCompleteIfConst(Scope *S, bool AfterExclaim) const {
+void SemaCodeCompletion::CodeCompleteIfConst(Scope *S,
+ bool AfterExclaim) const {
ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
CodeCompleter->getCodeCompletionTUInfo(),
CodeCompletionContext::CCC_Other);
>From 144facdf0a54ba68fd5ef861d54b31939c3af96f Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Sat, 8 Mar 2025 00:51:41 +0800
Subject: [PATCH 10/10] Add pattern tests
---
clang/test/CodeCompletion/if-const.cpp | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/clang/test/CodeCompletion/if-const.cpp b/clang/test/CodeCompletion/if-const.cpp
index 82311ce437321..43fef83b671f1 100644
--- a/clang/test/CodeCompletion/if-const.cpp
+++ b/clang/test/CodeCompletion/if-const.cpp
@@ -3,11 +3,24 @@ void test() {
if constexpr (Flag) {
return;
}
- // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:3:7 %s -o - | FileCheck -check-prefix=CHECK-CXX17 %s
- // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:3:7 %s -o - | FileCheck -check-prefix=CHECK-CXX23 %s
- // CHECK-CXX17: constexpr
- // CHECK-CXX23: consteval
+ // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-at=%s:3:7 %s | FileCheck -check-prefix=CHECK-CXX17 %s
+ // RUN: %clang_cc1 -fsyntax-only -std=c++17 -code-completion-patterns -code-completion-at=%s:3:7 %s | FileCheck -check-prefix=CHECK-PATTERN-CXX17 %s
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:3:7 %s | FileCheck -check-prefix=CHECK-CXX23 %s
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-patterns -code-completion-at=%s:3:7 %s | FileCheck -check-prefix=CHECK-PATTERN-CXX23 %s
+ // CHECK-CXX17: COMPLETION: constexpr
+ // CHECK-PATTERN-CXX17: COMPLETION: Pattern : constexpr (<#condition#>) {
+ // CHECK-PATTERN-CXX17: <#statements#>
+ // CHECK-PATTERN-CXX17: }
+ // CHECK-CXX23: COMPLETION: consteval
+ // CHECK-PATTERN-CXX23: COMPLETION: Pattern : consteval {
+ // CHECK-PATTERN-CXX23: <#statements#>
+ // CHECK-PATTERN-CXX23: }
if !c
- // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:10:8 %s -o - | FileCheck -check-prefix=CHECK-CXX23-NOT %s
- // CHECK-CXX23-NOT: consteval
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-at=%s:18:8 %s -o - | FileCheck -check-prefix=CHECK-CXX23-EXCLAIM %s
+ // RUN: %clang_cc1 -fsyntax-only -std=c++23 -code-completion-patterns -code-completion-at=%s:18:8 %s -o - | FileCheck -check-prefix=CHECK-PATTERN-CXX23-EXCLAIM %s
+ // CHECK-CXX23-EXCLAIM: COMPLETION: consteval
+ // CHECK-CXX23-EXCLAIM-NOT: constexpr
+ // CHECK-PATTERN-CXX23-EXCLAIM: COMPLETION: Pattern : consteval {
+ // CHECK-PATTERN-CXX23-EXCLAIM: <#statements#>
+ // CHECK-PATTERN-CXX23-EXCLAIM: }
}
More information about the cfe-commits
mailing list