// Part of the Carbon Language project, under the Apache License v2.0 with LLVM // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #ifndef CARBON_TOOLCHAIN_SEM_IR_EXPR_INFO_H_ #define CARBON_TOOLCHAIN_SEM_IR_EXPR_INFO_H_ #include #include "toolchain/sem_ir/file.h" #include "toolchain/sem_ir/ids.h" namespace Carbon::SemIR { // The expression category of a sem_ir instruction. See /docs/design/values.md // for details. enum class ExprCategory : int8_t { // This instruction does not correspond to an expression, and as such has no // category. NotExpr, // The category of this instruction is not known due to an error. Error, // This instruction represents a value expression. Value, // This instruction represents a durable reference expression, that denotes an // object that outlives the current full expression context. DurableRef, // This instruction represents an ephemeral reference expression, that denotes // an object that does not outlive the current full expression context. EphemeralRef, // This instruction represents an initializing expression, that describes how // to initialize an object. Initializing, // This instruction represents a syntactic combination of expressions that are // permitted to have different expression categories. This is used for tuple // and struct literals, where the subexpressions for different elements can // have different categories. Mixed, Last = Mixed }; // Returns the expression category for an instruction. auto GetExprCategory(const File& file, InstId inst_id) -> ExprCategory; // Returns whether the given expression category is for a reference expression. inline auto IsRefCategory(ExprCategory cat) -> bool { return cat == ExprCategory::DurableRef || cat == ExprCategory::EphemeralRef; } // Given an initializing expression, find its return slot argument. Returns // `None` if there is no return slot, because the initialization is not // performed in place. auto FindReturnSlotArgForInitializer(const File& sem_ir, InstId init_id) -> InstId; } // namespace Carbon::SemIR #endif // CARBON_TOOLCHAIN_SEM_IR_EXPR_INFO_H_