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
