https://github.com/usx95 updated 
https://github.com/llvm/llvm-project/pull/131997

>From 9220b14a8147850a39e2c9bdf1188f2135b7a0ae Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <u...@google.com>
Date: Wed, 19 Mar 2025 10:25:07 +0000
Subject: [PATCH 1/3] [clang] Do not infer lifetimebound for functions with
 void return type

---
 clang/lib/Sema/SemaAttr.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index defdda17c32de..a6e827a421134 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -217,7 +217,7 @@ void Sema::inferGslOwnerPointerAttribute(CXXRecordDecl 
*Record) {
 }
 
 void Sema::inferLifetimeBoundAttribute(FunctionDecl *FD) {
-  if (FD->getNumParams() == 0)
+  if (FD->getNumParams() == 0 || FD->getReturnType()->isVoidType())
     return;
 
   if (unsigned BuiltinID = FD->getBuiltinID()) {

>From 052bc3f4ff0b36aaf9610bbeed13373ef41f9b46 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <u...@google.com>
Date: Thu, 20 Mar 2025 09:05:16 +0000
Subject: [PATCH 2/3] add tests

---
 clang/lib/Sema/SemaAttr.cpp  |  6 +++++-
 clang/test/Sema/GH126231.cpp | 18 ++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/GH126231.cpp

diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index a7184f08e28b1..2ac50bf1d9569 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -14,6 +14,7 @@
 #include "CheckExprLifetime.h"
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/Attr.h"
+#include "clang/AST/DeclCXX.h"
 #include "clang/AST/Expr.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Lex/Preprocessor.h"
@@ -217,7 +218,10 @@ void Sema::inferGslOwnerPointerAttribute(CXXRecordDecl 
*Record) {
 }
 
 void Sema::inferLifetimeBoundAttribute(FunctionDecl *FD) {
-  if (FD->getNumParams() == 0 || FD->getReturnType()->isVoidType())
+  if (FD->getNumParams() == 0)
+    return;
+  // Skip void returning functions (except constructors).
+  if (!isa<CXXConstructorDecl>(FD) && FD->getReturnType()->isVoidType())
     return;
 
   if (unsigned BuiltinID = FD->getBuiltinID()) {
diff --git a/clang/test/Sema/GH126231.cpp b/clang/test/Sema/GH126231.cpp
new file mode 100644
index 0000000000000..d0140591491bd
--- /dev/null
+++ b/clang/test/Sema/GH126231.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -std=c++20 -Wno-ignored-attributes -Wno-unused-value 
-verify %s
+// expected-no-diagnostics
+namespace std {
+template <class T>
+constexpr const T& as_const(T&) noexcept;
+
+// We need two declarations to see the error for some reason *shrug*
+template <class T> void as_const(const T&&) noexcept = delete;
+template <class T> void as_const(const T&&) noexcept;
+}
+
+namespace GH126231 {
+
+void test() {
+    int a = 1;
+    std::as_const(a);
+}
+}

>From 4ed31e255e6409afdbf83919e61e94245268a23d Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <u...@google.com>
Date: Mon, 24 Mar 2025 16:38:47 +0000
Subject: [PATCH 3/3] address comments

---
 clang/lib/Sema/SemaAttr.cpp  | 3 ++-
 clang/test/Sema/GH126231.cpp | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index 2ac50bf1d9569..ad79ef135eae3 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -220,7 +220,8 @@ void Sema::inferGslOwnerPointerAttribute(CXXRecordDecl 
*Record) {
 void Sema::inferLifetimeBoundAttribute(FunctionDecl *FD) {
   if (FD->getNumParams() == 0)
     return;
-  // Skip void returning functions (except constructors).
+  // Skip void returning functions (except constructors). This can occur in
+  // cases like 'as_const'.
   if (!isa<CXXConstructorDecl>(FD) && FD->getReturnType()->isVoidType())
     return;
 
diff --git a/clang/test/Sema/GH126231.cpp b/clang/test/Sema/GH126231.cpp
index d0140591491bd..d10fc79c3b628 100644
--- a/clang/test/Sema/GH126231.cpp
+++ b/clang/test/Sema/GH126231.cpp
@@ -4,7 +4,7 @@ namespace std {
 template <class T>
 constexpr const T& as_const(T&) noexcept;
 
-// We need two declarations to see the error for some reason *shrug*
+// We need two declarations to see the error for some reason.
 template <class T> void as_const(const T&&) noexcept = delete;
 template <class T> void as_const(const T&&) noexcept;
 }

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to