2018-02-07 01:46:29 +01:00
|
|
|
#include "attr.h"
|
2018-02-07 22:57:58 +01:00
|
|
|
|
2018-02-07 01:46:29 +01:00
|
|
|
#include <sstream>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace Fortran {
|
2018-02-08 00:54:07 +01:00
|
|
|
namespace semantics {
|
2018-02-07 01:46:29 +01:00
|
|
|
|
|
|
|
std::ostream &operator<<(std::ostream &o, Attr attr) {
|
|
|
|
switch (attr) {
|
|
|
|
case Attr::ABSTRACT: return o << "ABSTRACT";
|
|
|
|
case Attr::ALLOCATABLE: return o << "ALLOCATABLE";
|
|
|
|
case Attr::ASYNCHRONOUS: return o << "ASYNCHRONOUS";
|
|
|
|
case Attr::BIND_C: return o << "BIND(C)";
|
|
|
|
case Attr::CONTIGUOUS: return o << "CONTIGUOUS";
|
|
|
|
case Attr::EXTERNAL: return o << "EXTERNAL";
|
|
|
|
case Attr::INTENT_IN: return o << "INTENT_IN";
|
|
|
|
case Attr::INTENT_OUT: return o << "INTENT_OUT";
|
|
|
|
case Attr::INTRINSIC: return o << "INTRINSIC";
|
|
|
|
case Attr::OPTIONAL: return o << "OPTIONAL";
|
|
|
|
case Attr::PARAMETER: return o << "PARAMETER";
|
|
|
|
case Attr::POINTER: return o << "POINTER";
|
|
|
|
case Attr::PRIVATE: return o << "PRIVATE";
|
|
|
|
case Attr::PROTECTED: return o << "PROTECTED";
|
|
|
|
case Attr::PUBLIC: return o << "PUBLIC";
|
|
|
|
case Attr::SAVE: return o << "SAVE";
|
|
|
|
case Attr::TARGET: return o << "TARGET";
|
|
|
|
case Attr::VALUE: return o << "VALUE";
|
|
|
|
case Attr::VOLATILE: return o << "VOLATILE";
|
|
|
|
default: CRASH_NO_CASE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::ostream &operator<<(std::ostream &o, const Attrs &attrs) {
|
|
|
|
int n = 0;
|
|
|
|
for (auto attr : attrs) {
|
2018-02-08 00:54:07 +01:00
|
|
|
if (n++) {
|
|
|
|
o << ", ";
|
|
|
|
}
|
2018-02-07 01:46:29 +01:00
|
|
|
o << attr;
|
|
|
|
}
|
|
|
|
return o;
|
|
|
|
}
|
|
|
|
|
|
|
|
void checkAttrs(std::string className, Attrs attrs, Attrs allowed) {
|
|
|
|
for (auto attr : attrs) {
|
|
|
|
if (allowed.find(attr) == allowed.end()) {
|
|
|
|
std::stringstream temp;
|
|
|
|
temp << attr;
|
2018-02-08 00:19:54 +01:00
|
|
|
parser::die("invalid attribute '%s' for class %s", temp.str().c_str(),
|
2018-02-07 01:46:29 +01:00
|
|
|
className.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-08 00:54:07 +01:00
|
|
|
} // namespace semantics
|
2018-02-07 01:46:29 +01:00
|
|
|
} // namespace Fortran
|