https://github.com/lodha1503 updated 
https://github.com/llvm/llvm-project/pull/205408

>From 788a78fb0b95a2975d263eb593cb1efc58b82afc Mon Sep 17 00:00:00 2001
From: lodha1503 <[email protected]>
Date: Wed, 24 Jun 2026 00:40:22 +0530
Subject: [PATCH 1/2] [Clang][AST] Add source range for deleted and defaulted
 functions

---
 clang/lib/Parse/Parser.cpp                    |  2 ++
 .../AST/ast-dump-deleted-defaulted-range.cpp  | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 clang/test/AST/ast-dump-deleted-defaulted-range.cpp

diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 5e1fd4df1a3f0..6bf1315ede69b 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -1308,12 +1308,14 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator 
&D,
           << 1 /* deleted */;
       BodyKind = Sema::FnBodyKind::Delete;
       DeletedMessage = ParseCXXDeletedFunctionMessage();
+      D.SetRangeEnd(PP.getLocForEndOfToken(KWLoc).getLocWithOffset(-1));
     } else if (TryConsumeToken(tok::kw_default, KWLoc)) {
       Diag(KWLoc, getLangOpts().CPlusPlus11
                       ? diag::warn_cxx98_compat_defaulted_deleted_function
                       : diag::ext_defaulted_deleted_function)
           << 0 /* defaulted */;
       BodyKind = Sema::FnBodyKind::Default;
+      D.SetRangeEnd(PP.getLocForEndOfToken(KWLoc).getLocWithOffset(-1));
     } else {
       llvm_unreachable("function definition after = not 'delete' or 
'default'");
     }
diff --git a/clang/test/AST/ast-dump-deleted-defaulted-range.cpp 
b/clang/test/AST/ast-dump-deleted-defaulted-range.cpp
new file mode 100644
index 0000000000000..5eb0a5cecd778
--- /dev/null
+++ b/clang/test/AST/ast-dump-deleted-defaulted-range.cpp
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -std=c++11 -ast-dump %s | FileCheck %s
+
+void delfunc() = delete;
+// CHECK: FunctionDecl{{.*}} <{{.*}}[[@LINE-1]]:1, col:23> col:6 delfunc 'void 
()' delete
+
+struct S {
+  inline S();
+};
+
+inline S::S() = default;
+// CHECK: CXXConstructorDecl{{.*}} <line:[[@LINE-1]]:1, col:23>{{.*}}S 'void 
()' inline default
+
+struct v {
+  void f() = delete;
+};
+// CHECK: CXXMethodDecl{{.*}} <line:[[@LINE-2]]:3, col:19> col:8 f 'void ()' 
delete
+
+class Truck {
+  inline Truck();
+};
+
+inline Truck::Truck() = default;
+// CHECK: CXXConstructorDecl{{.*}} <line:[[@LINE-1]]:1, col:31>{{.*}}Truck 
'void ()' inline default
+
+template <class T> void bubbleSort(T a[], int n) = delete;
+// CHECK: FunctionTemplateDecl{{.*}} <line:[[@LINE-1]]:1, col:57> col:25 
bubbleSort
+
+template <typename T> class Array {
+public:
+    Array(T arr[], int s);
+    void print() = delete;
+};
+// CHECK: CXXMethodDecl{{.*}} <line:[[@LINE-2]]:5, col:25> col:10 print 'void 
()' delete

>From 3ad87ceb3c750ac049f0dadb7b051a8952d53cdf Mon Sep 17 00:00:00 2001
From: lodha1503 <[email protected]>
Date: Fri, 26 Jun 2026 20:33:47 +0530
Subject: [PATCH 2/2] Resolved Comments and fixed delete with message

---
 clang/lib/Parse/ParseCXXInlineMethods.cpp       |  5 ++---
 clang/lib/Parse/Parser.cpp                      |  2 +-
 .../AST/ast-dump-deleted-defaulted-range.cpp    | 17 +++++++++--------
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/clang/lib/Parse/ParseCXXInlineMethods.cpp 
b/clang/lib/Parse/ParseCXXInlineMethods.cpp
index 6189c854e5fbf..8c66d53aea0f4 100644
--- a/clang/lib/Parse/ParseCXXInlineMethods.cpp
+++ b/clang/lib/Parse/ParseCXXInlineMethods.cpp
@@ -101,7 +101,6 @@ NamedDecl *Parser::ParseCXXInlineMethodDef(
 
     bool Delete = false;
     SourceLocation KWLoc;
-    SourceLocation KWEndLoc = Tok.getEndLoc().getLocWithOffset(-1);
     if (TryConsumeToken(tok::kw_delete, KWLoc)) {
       Diag(KWLoc, getLangOpts().CPlusPlus11
                       ? diag::warn_cxx98_compat_defaulted_deleted_function
@@ -111,7 +110,7 @@ NamedDecl *Parser::ParseCXXInlineMethodDef(
       Actions.SetDeclDeleted(FnD, KWLoc, Message);
       Delete = true;
       if (auto *DeclAsFunction = dyn_cast<FunctionDecl>(FnD)) {
-        DeclAsFunction->setRangeEnd(KWEndLoc);
+        DeclAsFunction->setRangeEnd( Message? PrevTokLocation : 
PP.getLocForEndOfToken(KWLoc).getLocWithOffset(-1));
       }
     } else if (TryConsumeToken(tok::kw_default, KWLoc)) {
       Diag(KWLoc, getLangOpts().CPlusPlus11
@@ -120,7 +119,7 @@ NamedDecl *Parser::ParseCXXInlineMethodDef(
         << 0 /* defaulted */;
       Actions.SetDeclDefaulted(FnD, KWLoc);
       if (auto *DeclAsFunction = dyn_cast<FunctionDecl>(FnD)) {
-        DeclAsFunction->setRangeEnd(KWEndLoc);
+        
DeclAsFunction->setRangeEnd(PP.getLocForEndOfToken(KWLoc).getLocWithOffset(-1));
       }
     } else {
       llvm_unreachable("function definition after = not 'delete' or 
'default'");
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 6bf1315ede69b..08b4181243a4b 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -1308,7 +1308,7 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator 
&D,
           << 1 /* deleted */;
       BodyKind = Sema::FnBodyKind::Delete;
       DeletedMessage = ParseCXXDeletedFunctionMessage();
-      D.SetRangeEnd(PP.getLocForEndOfToken(KWLoc).getLocWithOffset(-1));
+      D.SetRangeEnd(DeletedMessage? PrevTokLocation: 
PP.getLocForEndOfToken(KWLoc).getLocWithOffset(-1));
     } else if (TryConsumeToken(tok::kw_default, KWLoc)) {
       Diag(KWLoc, getLangOpts().CPlusPlus11
                       ? diag::warn_cxx98_compat_defaulted_deleted_function
diff --git a/clang/test/AST/ast-dump-deleted-defaulted-range.cpp 
b/clang/test/AST/ast-dump-deleted-defaulted-range.cpp
index 5eb0a5cecd778..c2a18f1ce4d2e 100644
--- a/clang/test/AST/ast-dump-deleted-defaulted-range.cpp
+++ b/clang/test/AST/ast-dump-deleted-defaulted-range.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -std=c++11 -ast-dump %s | FileCheck %s
+// RUN: %clang_cc1 -ast-dump %s | FileCheck %s
 
 void delfunc() = delete;
 // CHECK: FunctionDecl{{.*}} <{{.*}}[[@LINE-1]]:1, col:23> col:6 delfunc 'void 
()' delete
@@ -15,13 +15,6 @@ struct v {
 };
 // CHECK: CXXMethodDecl{{.*}} <line:[[@LINE-2]]:3, col:19> col:8 f 'void ()' 
delete
 
-class Truck {
-  inline Truck();
-};
-
-inline Truck::Truck() = default;
-// CHECK: CXXConstructorDecl{{.*}} <line:[[@LINE-1]]:1, col:31>{{.*}}Truck 
'void ()' inline default
-
 template <class T> void bubbleSort(T a[], int n) = delete;
 // CHECK: FunctionTemplateDecl{{.*}} <line:[[@LINE-1]]:1, col:57> col:25 
bubbleSort
 
@@ -31,3 +24,11 @@ template <typename T> class Array {
     void print() = delete;
 };
 // CHECK: CXXMethodDecl{{.*}} <line:[[@LINE-2]]:5, col:25> col:10 print 'void 
()' delete
+
+void delfunc2() = delete("reason");
+// CHECK: FunctionDecl{{.*}} <{{.*}}[[@LINE-1]]:1, col:34> col:6 delfunc2 
'void ()' delete
+
+struct w {
+  void g() = delete("reason");
+};
+// CHECK: CXXMethodDecl{{.*}} <line:[[@LINE-2]]:3, col:29> col:8 g 'void ()' 
delete

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to