[llvm-branch-commits] [clang] release/20.x: [clang] Do not infer lifetimebound for functions with void return type (#131997) (PR #133997)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Apr 11 09:37:40 PDT 2025


https://github.com/llvmbot updated https://github.com/llvm/llvm-project/pull/133997

>From 53141e4e3c650d41ef2a4be7f79e7144264029da Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <usx at google.com>
Date: Mon, 24 Mar 2025 17:42:33 +0100
Subject: [PATCH] [clang] Do not infer lifetimebound for functions with void
 return type (#131997)

Fixes: https://github.com/llvm/llvm-project/issues/126231
Also found in : https://github.com/microsoft/STL/issues/5271

(cherry picked from commit 65ee2813f9f9a8cd11c5e9ea372da7d12867b52f)
---
 clang/lib/Sema/SemaAttr.cpp  |  5 +++++
 clang/test/Sema/GH126231.cpp | 18 ++++++++++++++++++
 2 files changed, 23 insertions(+)
 create mode 100644 clang/test/Sema/GH126231.cpp

diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index 6907fa91e28c2..27b5eb5f2c773 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"
@@ -219,6 +220,10 @@ void Sema::inferGslOwnerPointerAttribute(CXXRecordDecl *Record) {
 void Sema::inferLifetimeBoundAttribute(FunctionDecl *FD) {
   if (FD->getNumParams() == 0)
     return;
+  // Skip void returning functions (except constructors). This can occur in
+  // cases like 'as_const'.
+  if (!isa<CXXConstructorDecl>(FD) && FD->getReturnType()->isVoidType())
+    return;
 
   if (unsigned BuiltinID = FD->getBuiltinID()) {
     // Add lifetime attribute to std::move, std::fowrard et al.
diff --git a/clang/test/Sema/GH126231.cpp b/clang/test/Sema/GH126231.cpp
new file mode 100644
index 0000000000000..d10fc79c3b628
--- /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.
+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);
+}
+}



More information about the llvm-branch-commits mailing list