https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/133997
Backport 65ee281 Requested by: @cor3ntin >From 86ee14f26f1569d39b452ff13d44d05a357feb6b Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <u...@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); +} +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits