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