The lifetimes of local variables and function parameters must end before the call to a [[clang::musttail]] function, instead of before the return, because we will not have a stack frame to hold them when doing the call. This documents this limitation, and adds diagnostics to warn about some code which is invalid because of it.
47 lines
1.7 KiB
C++
47 lines
1.7 KiB
C++
//===- CheckExprLifetime.h ----------------------------------- -*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This files implements a statement-local lifetime analysis.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_SEMA_CHECK_EXPR_LIFETIME_H
|
|
#define LLVM_CLANG_SEMA_CHECK_EXPR_LIFETIME_H
|
|
|
|
#include "clang/AST/Expr.h"
|
|
#include "clang/Sema/Initialization.h"
|
|
#include "clang/Sema/Sema.h"
|
|
|
|
namespace clang::sema {
|
|
|
|
/// Describes an entity that is being assigned.
|
|
struct AssignedEntity {
|
|
// The left-hand side expression of the assignment.
|
|
Expr *LHS = nullptr;
|
|
CXXMethodDecl *AssignmentOperator = nullptr;
|
|
};
|
|
|
|
/// Check that the lifetime of the given expr (and its subobjects) is
|
|
/// sufficient for initializing the entity, and perform lifetime extension
|
|
/// (when permitted) if not.
|
|
void checkExprLifetime(Sema &SemaRef, const InitializedEntity &Entity,
|
|
Expr *Init);
|
|
|
|
/// Check that the lifetime of the given expr (and its subobjects) is
|
|
/// sufficient for assigning to the entity.
|
|
void checkExprLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init);
|
|
|
|
/// Check that the lifetime of the given expr (and its subobjects) is
|
|
/// sufficient, assuming that it is passed as an argument to a musttail
|
|
/// function.
|
|
void checkExprLifetimeMustTailArg(Sema &SemaRef,
|
|
const InitializedEntity &Entity, Expr *Init);
|
|
|
|
} // namespace clang::sema
|
|
|
|
#endif // LLVM_CLANG_SEMA_CHECK_EXPR_LIFETIME_H
|