File tree Expand file tree Collapse file tree 2 files changed +23
-0
lines changed Expand file tree Collapse file tree 2 files changed +23
-0
lines changed Original file line number Diff line number Diff line change 1414#include " CheckExprLifetime.h"
1515#include " clang/AST/ASTConsumer.h"
1616#include " clang/AST/Attr.h"
17+ #include " clang/AST/DeclCXX.h"
1718#include " clang/AST/Expr.h"
1819#include " clang/Basic/TargetInfo.h"
1920#include " clang/Lex/Preprocessor.h"
@@ -219,6 +220,10 @@ void Sema::inferGslOwnerPointerAttribute(CXXRecordDecl *Record) {
219220void Sema::inferLifetimeBoundAttribute (FunctionDecl *FD) {
220221 if (FD->getNumParams () == 0 )
221222 return ;
223+ // Skip void returning functions (except constructors). This can occur in
224+ // cases like 'as_const'.
225+ if (!isa<CXXConstructorDecl>(FD) && FD->getReturnType ()->isVoidType ())
226+ return ;
222227
223228 if (unsigned BuiltinID = FD->getBuiltinID ()) {
224229 // Add lifetime attribute to std::move, std::fowrard et al.
Original file line number Diff line number Diff line change 1+ // RUN: %clang_cc1 -std=c++20 -Wno-ignored-attributes -Wno-unused-value -verify %s
2+ // expected-no-diagnostics
3+ namespace std {
4+ template <class T >
5+ constexpr const T& as_const (T&) noexcept ;
6+
7+ // We need two declarations to see the error for some reason.
8+ template <class T > void as_const (const T&&) noexcept = delete;
9+ template <class T > void as_const (const T&&) noexcept ;
10+ }
11+
12+ namespace GH126231 {
13+
14+ void test () {
15+ int a = 1 ;
16+ std::as_const (a);
17+ }
18+ }
You can’t perform that action at this time.
0 commit comments