9#ifndef FORTRAN_SEMANTICS_ATTR_H_
10#define FORTRAN_SEMANTICS_ATTR_H_
12#include "flang/Common/enum-set.h"
13#include "flang/Common/idioms.h"
21namespace Fortran::semantics {
24ENUM_CLASS(Attr, ABSTRACT, ALLOCATABLE, ASYNCHRONOUS, BIND_C, CONTIGUOUS,
25 DEFERRED, ELEMENTAL, EXTENDS, EXTERNAL, IMPURE, INTENT_IN, INTENT_INOUT,
26 INTENT_OUT, INTRINSIC, MODULE, NON_OVERRIDABLE, NON_RECURSIVE, NOPASS,
27 OPTIONAL, PARAMETER, PASS, POINTER, PRIVATE, PROTECTED, PUBLIC, PURE,
28 RECURSIVE, SAVE, TARGET, VALUE, VOLATILE)
31class Attrs :
public common::EnumSet<Attr, Attr_enumSize> {
33 using enumSetType = common::EnumSet<Attr, Attr_enumSize>;
36 using enumSetType::enumSetType;
37 Attrs(
const enumSetType &attrs) : enumSetType(attrs) {}
38 Attrs(enumSetType &&attrs) : enumSetType(std::move(attrs)) {}
39 constexpr bool HasAny(
const Attrs &x)
const {
return !(*
this & x).none(); }
40 constexpr bool HasAll(
const Attrs &x)
const {
return (~*
this & x).none(); }
42 void CheckValid(
const Attrs &allowed)
const;
45 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &,
const Attrs &);
49std::string AttrToString(Attr attr);
51llvm::raw_ostream &operator<<(llvm::raw_ostream &o, Attr attr);
52llvm::raw_ostream &operator<<(llvm::raw_ostream &o,
const Attrs &attrs);