aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Evaluate/tools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Evaluate/tools.cpp')
-rw-r--r--flang/lib/Evaluate/tools.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 4699c53..b2a50ab 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -1754,13 +1754,34 @@ bool IsSequenceOrBindCType(const DerivedTypeSpec *derived) {
derived->typeSymbol().get<DerivedTypeDetails>().sequence());
}
+static bool IsSameModule(const Scope *x, const Scope *y) {
+ if (x == y) {
+ return true;
+ } else if (x && y) {
+ // Allow for a builtin module to be read from distinct paths
+ const Symbol *xSym{x->symbol()};
+ const Symbol *ySym{y->symbol()};
+ if (xSym && ySym && xSym->name() == ySym->name()) {
+ const auto *xMod{xSym->detailsIf<ModuleDetails>()};
+ const auto *yMod{ySym->detailsIf<ModuleDetails>()};
+ if (xMod && yMod) {
+ auto xHash{xMod->moduleFileHash()};
+ auto yHash{yMod->moduleFileHash()};
+ return xHash && yHash && *xHash == *yHash;
+ }
+ }
+ }
+ return false;
+}
+
bool IsBuiltinDerivedType(const DerivedTypeSpec *derived, const char *name) {
- if (!derived) {
- return false;
- } else {
+ if (derived) {
const auto &symbol{derived->typeSymbol()};
- return &symbol.owner() == symbol.owner().context().GetBuiltinsScope() &&
- symbol.name() == "__builtin_"s + name;
+ const Scope &scope{symbol.owner()};
+ return symbol.name() == "__builtin_"s + name &&
+ IsSameModule(&scope, scope.context().GetBuiltinsScope());
+ } else {
+ return false;
}
}
@@ -1790,6 +1811,14 @@ bool IsNotifyType(const DerivedTypeSpec *derived) {
return IsBuiltinDerivedType(derived, "notify_type");
}
+bool IsIeeeFlagType(const DerivedTypeSpec *derived) {
+ return IsBuiltinDerivedType(derived, "ieee_flag_type");
+}
+
+bool IsIeeeRoundType(const DerivedTypeSpec *derived) {
+ return IsBuiltinDerivedType(derived, "ieee_round_type");
+}
+
bool IsTeamType(const DerivedTypeSpec *derived) {
return IsBuiltinDerivedType(derived, "team_type");
}