55 ENUM_CLASS(Attr, PassedObject, PercentVal, PercentRef);
63 explicit AssumedType(
const Symbol &);
64 DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(AssumedType)
65 const Symbol &symbol()
const {
return symbol_; }
67 bool operator==(
const AssumedType &that)
const {
68 return &*symbol_ == &*that.symbol_;
70 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
76 DECLARE_CONSTRUCTORS_AND_ASSIGNMENTS(ActualArgument)
78 explicit ActualArgument(common::CopyableIndirection<
Expr<SomeType>> &&);
80 explicit ActualArgument(common::Label);
86 std::get_if<common::CopyableIndirection<Expr<SomeType>>>(&u_)}) {
92 const Expr<SomeType> *UnwrapExpr()
const {
94 std::get_if<common::CopyableIndirection<Expr<SomeType>>>(&u_)}) {
101 const Symbol *GetAssumedTypeDummy()
const {
102 if (
const AssumedType * aType{std::get_if<AssumedType>(&u_)}) {
103 return &aType->symbol();
109 common::Label GetLabel()
const {
return std::get<common::Label>(u_); }
111 std::optional<DynamicType> GetType()
const;
113 bool operator==(
const ActualArgument &)
const;
114 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
116 std::optional<parser::CharBlock> keyword()
const {
return keyword_; }
117 ActualArgument &set_keyword(parser::CharBlock x) {
121 bool isAlternateReturn()
const {
122 return std::holds_alternative<common::Label>(u_);
124 bool isPassedObject()
const {
return attrs_.test(Attr::PassedObject); }
125 ActualArgument &set_isPassedObject(
bool yes =
true) {
127 attrs_ = attrs_ + Attr::PassedObject;
129 attrs_ = attrs_ - Attr::PassedObject;
134 bool Matches(
const characteristics::DummyArgument &)
const;
135 common::Intent dummyIntent()
const {
return dummyIntent_; }
136 ActualArgument &set_dummyIntent(common::Intent intent) {
137 dummyIntent_ = intent;
140 std::optional<parser::CharBlock> sourceLocation()
const {
141 return sourceLocation_;
143 ActualArgument &set_sourceLocation(std::optional<parser::CharBlock> at) {
144 sourceLocation_ = at;
152 bool isPercentVal()
const {
return attrs_.test(Attr::PercentVal); };
153 ActualArgument &set_isPercentVal() {
154 attrs_ = attrs_ + Attr::PercentVal;
158 bool isPercentRef()
const {
return attrs_.test(Attr::PercentRef); };
159 ActualArgument &set_isPercentRef() {
160 attrs_ = attrs_ + Attr::PercentRef;
170 std::variant<common::CopyableIndirection<Expr<SomeType>>,
AssumedType,
173 std::optional<parser::CharBlock> keyword_;
175 common::Intent dummyIntent_{common::Intent::Default};
176 std::optional<parser::CharBlock> sourceLocation_;
197struct ProcedureDesignator {
198 EVALUATE_UNION_CLASS_BOILERPLATE(ProcedureDesignator)
200 explicit ProcedureDesignator(
const Symbol &n) : u{n} {}
201 explicit ProcedureDesignator(
Component &&);
205 const Symbol *GetSymbol()
const;
206 const SymbolRef *UnwrapSymbolRef()
const;
215 const Symbol *GetInterfaceSymbol()
const;
217 std::string GetName()
const;
218 std::optional<DynamicType> GetType()
const;
220 bool IsElemental()
const;
222 std::optional<Expr<SubscriptInteger>> LEN()
const;
223 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
226 common::CopyableIndirection<Component>>
234 CLASS_BOILERPLATE(ProcedureRef)
236 bool hasAlternateReturns =
false)
237 : proc_{std::move(p)}, arguments_{std::move(a)},
238 hasAlternateReturns_{hasAlternateReturns} {}
240 static void Deleter(ProcedureRef *);
244 ActualArguments &arguments() {
return arguments_; }
245 const ActualArguments &arguments()
const {
return arguments_; }
247 Chevrons &chevrons() {
return chevrons_; }
248 const Chevrons &chevrons()
const {
return chevrons_; }
249 void set_chevrons(Chevrons &&chevrons) { chevrons_ = std::move(chevrons); }
251 std::optional<Expr<SubscriptInteger>> LEN()
const;
253 static constexpr int Corank() {
return 0; }
254 bool IsElemental()
const {
return proc_.IsElemental(); }
255 bool hasAlternateReturns()
const {
return hasAlternateReturns_; }
258 if (
static_cast<std::size_t
>(n) < arguments_.size() && arguments_[n]) {
259 return arguments_[n]->UnwrapExpr();
265 if (
static_cast<std::size_t
>(n) < arguments_.size() && arguments_[n]) {
266 return arguments_[n]->UnwrapExpr();
272 bool operator==(
const ProcedureRef &)
const;
273 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
277 ActualArguments arguments_;
279 bool hasAlternateReturns_;
282template <
typename A>
class FunctionRef :
public ProcedureRef {
285 CLASS_BOILERPLATE(FunctionRef)
286 explicit FunctionRef(ProcedureRef &&pr) : ProcedureRef{std::move(pr)} {}
288 : ProcedureRef{std::move(p), std::move(a)} {}
290 std::optional<DynamicType> GetType()
const {
291 if constexpr (IsLengthlessIntrinsicType<A>) {
293 }
else if (
auto type{proc_.GetType()}) {
299 return type->DropNonConstantCharacterLength();