//===--- FunctionPointer.h - Types for the constexpr VM ----------*- 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 // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_AST_INTERP_FUNCTION_POINTER_H #define LLVM_CLANG_AST_INTERP_FUNCTION_POINTER_H #include "Function.h" #include "Primitives.h" #include "clang/AST/APValue.h" namespace clang { class ASTContext; namespace interp { class FunctionPointer final { private: const Function *Func; public: FunctionPointer() : Func(nullptr) {} FunctionPointer(const Function *Func) : Func(Func) { assert(Func); } const Function *getFunction() const { return Func; } APValue toAPValue() const { if (!Func) return APValue(static_cast(nullptr), CharUnits::Zero(), {}, /*OnePastTheEnd=*/false, /*IsNull=*/true); return APValue(Func->getDecl(), CharUnits::Zero(), {}, /*OnePastTheEnd=*/false, /*IsNull=*/false); } void print(llvm::raw_ostream &OS) const { OS << "FnPtr("; if (Func) OS << Func->getName(); else OS << "nullptr"; OS << ")"; } std::string toDiagnosticString(const ASTContext &Ctx) const { if (!Func) return "nullptr"; return toAPValue().getAsString(Ctx, Func->getDecl()->getType()); } ComparisonCategoryResult compare(const FunctionPointer &RHS) const { if (Func == RHS.Func) return ComparisonCategoryResult::Equal; return ComparisonCategoryResult::Unordered; } }; inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, FunctionPointer FP) { FP.print(OS); return OS; } } // namespace interp } // namespace clang #endif