diff options
Diffstat (limited to 'flang/lib/Evaluate/tools.cpp')
-rw-r--r-- | flang/lib/Evaluate/tools.cpp | 39 |
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"); } |