[clang] [Sema] Add code completion for if constexpr (PR #124315)

2025-02-17 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From 23e07a719b8262bd68950812bf47c5b9c0ecbeba Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 1/5] [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 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 80ae87e7c5725..bcc0cb18b8739 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 a7406e134dd5cf0ac42ca195418514b0bd0c480d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 2/5] 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 0..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 69b805acddc2e3609ca2049b560fa564e1b9be13 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 3/5] 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 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/c

[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-02-17 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX edited 
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


[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-02-17 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX edited 
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


[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-03-07 Thread Letu Ren via cfe-commits

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 
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 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 
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 0..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 
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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-07 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX edited 
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


[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From e3f118c1435c0f87588c5c51ba01af1aa8136d1d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/14] [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 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 5b3a919475b6c47def9bdd4c5bdf083852173b5c Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/14] 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 0..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 4e0d4a7fcaf982dd41df7b5fae411f670afa3e56 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/14] 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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From e3f118c1435c0f87588c5c51ba01af1aa8136d1d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/11] [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 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 5b3a919475b6c47def9bdd4c5bdf083852173b5c Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/11] 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 0..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 4e0d4a7fcaf982dd41df7b5fae411f670afa3e56 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/11] 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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From e3f118c1435c0f87588c5c51ba01af1aa8136d1d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/12] [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 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 5b3a919475b6c47def9bdd4c5bdf083852173b5c Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/12] 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 0..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 4e0d4a7fcaf982dd41df7b5fae411f670afa3e56 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/12] 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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From e3f118c1435c0f87588c5c51ba01af1aa8136d1d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/13] [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 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 5b3a919475b6c47def9bdd4c5bdf083852173b5c Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/13] 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 0..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 4e0d4a7fcaf982dd41df7b5fae411f670afa3e56 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/13] 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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

FantasqueX wrote:

@HighCommander4 @zyn0217 Really appreciate for your review. Thanks a lot.

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


[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From e3f118c1435c0f87588c5c51ba01af1aa8136d1d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/16] [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 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 5b3a919475b6c47def9bdd4c5bdf083852173b5c Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/16] 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 0..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 4e0d4a7fcaf982dd41df7b5fae411f670afa3e56 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/16] 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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From e3f118c1435c0f87588c5c51ba01af1aa8136d1d Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 01/15] [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 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 5b3a919475b6c47def9bdd4c5bdf083852173b5c Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 02/15] 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 0..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 4e0d4a7fcaf982dd41df7b5fae411f670afa3e56 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 03/15] 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 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 --g

[clang] [clang][CodeComplete] Add code completion for if constexpr and consteval (PR #124315)

2025-03-13 Thread Letu Ren via cfe-commits


@@ -6749,6 +6749,55 @@ void SemaCodeCompletion::CodeCompleteInitializer(Scope 
*S, Decl *D) {
   CodeCompleteExpression(S, Data);
 }
 
+void SemaCodeCompletion::CodeCompleteIfConst(Scope *S,
+ bool AfterExclaim) const {
+  ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
+CodeCompleter->getCodeCompletionTUInfo(),
+CodeCompletionContext::CCC_Other);

FantasqueX wrote:

![image](https://github.com/user-attachments/assets/4ba0669a-8495-46a0-9b48-9ff9bde4adca)
I think they are different. In `CodeCompleteAfterIf`, it's valid to provide a 
statement. While in the new added `CodeCompleteKeywordAfterIf ` only two 
keywords are appropriate.

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


[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-02-24 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From ad4784ab47b65e478f669c6ef4b30008c76c5f0b Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 1/9] [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 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 80ae87e7c5725..bcc0cb18b8739 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 663224249233cc88fe1b9eafacf7c2563a02176e Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 2/9] 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 0..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 f91ad40faabf59aa6ca081ad11a15f3f5473a998 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 3/9] 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 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/c

[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-02-23 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From 576dcfa4a403b95665e98f9ff225ab5353192e23 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 1/6] [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 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 80ae87e7c5725..bcc0cb18b8739 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 e7b7a6f2cfa4d056b643716e28e9d91ee5ab9738 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 2/6] 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 0..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 7b4e81efe53e263e9410dd2994f126b5bdac5ef3 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 3/6] 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 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/c

[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-02-23 Thread Letu Ren via cfe-commits

FantasqueX wrote:

Hi @HighCommander4 thanks for your suggestions. I'm happy to add snippets 
support for `if constexpr` and `if consteval`. Since `if 
constexp` and `if !consteval` is valid, I 
decided to add code snippet completion in the specific code completion function 
instead of in statement completion. Do you think it is OK?

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


[clang] [Sema] Add code completion for if constexpr and consteval (PR #124315)

2025-02-23 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX updated 
https://github.com/llvm/llvm-project/pull/124315

>From 576dcfa4a403b95665e98f9ff225ab5353192e23 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 25 Jan 2025 01:23:52 +0800
Subject: [PATCH 1/7] [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 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 80ae87e7c5725..bcc0cb18b8739 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 e7b7a6f2cfa4d056b643716e28e9d91ee5ab9738 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Mon, 3 Feb 2025 22:49:38 +0800
Subject: [PATCH 2/7] 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 0..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 7b4e81efe53e263e9410dd2994f126b5bdac5ef3 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Sat, 15 Feb 2025 18:03:38 +0800
Subject: [PATCH 3/7] 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 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/c

[clang] [llvm] [RISCV][WIP] Add assembler support for Zvma (PR #132965)

2025-03-25 Thread Letu Ren via cfe-commits

https://github.com/FantasqueX created 
https://github.com/llvm/llvm-project/pull/132965

None

>From b07a5cafd1a0f281012796fb23085828d8b64f68 Mon Sep 17 00:00:00 2001
From: Letu Ren 
Date: Wed, 26 Mar 2025 01:44:50 +0800
Subject: [PATCH] [RISCV] Add assembler support for Zvma

---
 .../Driver/print-supported-extensions-riscv.c |  1 +
 .../test/Preprocessor/riscv-target-features.c |  9 
 llvm/docs/RISCVUsage.rst  |  3 +++
 llvm/lib/Target/RISCV/RISCVFeatures.td|  9 
 llvm/lib/Target/RISCV/RISCVInstrInfo.td   |  1 +
 llvm/lib/Target/RISCV/RISCVInstrInfoZvma.td   | 21 +++
 6 files changed, 44 insertions(+)
 create mode 100644 llvm/lib/Target/RISCV/RISCVInstrInfoZvma.td

diff --git a/clang/test/Driver/print-supported-extensions-riscv.c 
b/clang/test/Driver/print-supported-extensions-riscv.c
index 7e201b1149ec3..98addd1930505 100644
--- a/clang/test/Driver/print-supported-extensions-riscv.c
+++ b/clang/test/Driver/print-supported-extensions-riscv.c
@@ -192,6 +192,7 @@
 // CHECK-NEXT: zalasr   0.1   'Zalasr' (Load-Acquire and 
Store-Release Instructions)
 // CHECK-NEXT: zvbc32e  0.7   'Zvbc32e' (Vector Carryless 
Multiplication with 32-bits elements)
 // CHECK-NEXT: zvkgs0.7   'Zvkgs' (Vector-Scalar GCM 
instructions for Cryptography)
+// CHECK-NEXT: zvma 0.0   'Zvma' (High-throughput 
Matrix-multiplication Computation)
 // CHECK-NEXT: zvqdotq  0.0   'Zvqdotq' (Vector quad 
widening 4D Dot Product)
 // CHECK-NEXT: smctr1.0   'Smctr' (Control Transfer 
Records Machine Level)
 // CHECK-NEXT: ssctr1.0   'Ssctr' (Control Transfer 
Records Supervisor Level)
diff --git a/clang/test/Preprocessor/riscv-target-features.c 
b/clang/test/Preprocessor/riscv-target-features.c
index 58e91ba1243c3..2c2ce64e82236 100644
--- a/clang/test/Preprocessor/riscv-target-features.c
+++ b/clang/test/Preprocessor/riscv-target-features.c
@@ -203,6 +203,7 @@
 // CHECK-NOT: __riscv_zvfbfwma {{.*$}}
 // CHECK-NOT: __riscv_zvkgs {{.*$}}
 // CHECK-NOT: __riscv_zvqdotq {{.*$}}
+// CHECK-NOT: __riscv_zvma {{.*$}}
 
 // RUN: %clang --target=riscv32-unknown-linux-gnu \
 // RUN:   -march=rv32ia -E -dM %s \
@@ -1770,6 +1771,14 @@
 // RUN:   -o - | FileCheck --check-prefix=CHECK-ZVQDOTQ-EXT %s
 // CHECK-ZVQDOTQ-EXT: __riscv_zvqdotq 0{{$}}
 
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN:   -march=rv32i_zve32x_zvma0p0 -E -dM %s \
+// RUN:   -o - | FileCheck --check-prefix=CHECK-ZVMA-EXT %s
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN:   -march=rv64i_zve32x_zvma0p0 -E -dM %s \
+// RUN:   -o - | FileCheck --check-prefix=CHECK-ZVMA-EXT %s
+// CHECK-ZVMA-EXT: __riscv_zvma 0111{{$}}
+
 // RUN: %clang -target riscv32 -menable-experimental-extensions \
 // RUN:   -march=rv32izicfiss1p0 -E -dM %s \
 // RUN:   -o - | FileCheck --check-prefix=CHECK-ZICFISS-EXT %s
diff --git a/llvm/docs/RISCVUsage.rst b/llvm/docs/RISCVUsage.rst
index 8735b274a805f..8d744350313ea 100644
--- a/llvm/docs/RISCVUsage.rst
+++ b/llvm/docs/RISCVUsage.rst
@@ -340,6 +340,9 @@ The primary goal of experimental support is to assist in 
the process of ratifica
 ``experimental-zvqdotq``
   LLVM implements the `0.0.1 draft specification 
`__.
 
+``experimental-zvma``
+  LLVM implements the `SiFive proposal specification 
`__.
+
 To use an experimental extension from `clang`, you must add 
`-menable-experimental-extensions` to the command line, and specify the exact 
version of the experimental extension you are using.  To use an experimental 
extension with LLVM's internal developer tools (e.g. `llc`, `llvm-objdump`, 
`llvm-mc`), you must prefix the extension name with `experimental-`.  Note that 
you don't need to specify the version with internal tools, and shouldn't 
include the `experimental-` prefix with `clang`.
 
 Vendor Extensions
diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td 
b/llvm/lib/Target/RISCV/RISCVFeatures.td
index 5ed3ed917aa4c..f8371c952501b 100644
--- a/llvm/lib/Target/RISCV/RISCVFeatures.td
+++ b/llvm/lib/Target/RISCV/RISCVFeatures.td
@@ -830,6 +830,15 @@ def HasStdExtZvqdotq : 
Predicate<"Subtarget->hasStdExtZvqdotq()">,
AssemblerPredicate<(all_of FeatureStdExtZvqdotq),
"'Zvqdotq' (Vector quad widening 4D Dot Product)">;
 
+// High-throughput Matrix-multiplication Computation
+
+def FeatureStdExtZvma
+: RISCVExperimentalExtension<0, 0, "High-throughput Matrix-multiplication 
Computation",
+ [FeatureStdExtZve32x]>;
+def HasStdExtZvma : Predicate<"Subtarget->hasStdExtZvma()">,
+AssemblerPredicate<(all_of FeatureStdExtZvma),
+