mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:06:44 +00:00
[flang] Silence spurious error on non-CUDA use of CUDA module (#107444)
When a module file has been compiled with CUDA enabled, don't emit spurious errors about non-interoperable types when that module is read by a USE statement in a later non-CUDA compilation.
This commit is contained in:
parent
d8a8eae6da
commit
ce392471c0
@ -459,8 +459,5 @@ inline const DerivedTypeSpec *DeclTypeSpec::AsDerived() const {
|
||||
return const_cast<DeclTypeSpec *>(this)->AsDerived();
|
||||
}
|
||||
|
||||
std::optional<bool> IsInteroperableIntrinsicType(
|
||||
const DeclTypeSpec &, const common::LanguageFeatureControl &);
|
||||
|
||||
} // namespace Fortran::semantics
|
||||
#endif // FORTRAN_SEMANTICS_TYPE_H_
|
||||
|
@ -820,8 +820,8 @@ std::optional<bool> IsInteroperableIntrinsicType(const DynamicType &type,
|
||||
return true;
|
||||
case TypeCategory::Real:
|
||||
case TypeCategory::Complex:
|
||||
return (features && features->IsEnabled(common::LanguageFeature::CUDA)) ||
|
||||
type.kind() >= 4; // no short or half floats
|
||||
return type.kind() >= 4 /* not a short or half float */ || !features ||
|
||||
features->IsEnabled(common::LanguageFeature::CUDA);
|
||||
case TypeCategory::Logical:
|
||||
return type.kind() == 1; // C_BOOL
|
||||
case TypeCategory::Character:
|
||||
|
@ -3003,17 +3003,17 @@ parser::Messages CheckHelper::WhyNotInteroperableDerivedType(
|
||||
} else {
|
||||
msgs.Annex(std::move(bad));
|
||||
}
|
||||
} else if (!IsInteroperableIntrinsicType(
|
||||
*type, context_.languageFeatures())
|
||||
} else if (auto dyType{evaluate::DynamicType::From(*type)}; dyType &&
|
||||
!evaluate::IsInteroperableIntrinsicType(
|
||||
*dyType, &context_.languageFeatures())
|
||||
.value_or(false)) {
|
||||
auto maybeDyType{evaluate::DynamicType::From(*type)};
|
||||
if (type->category() == DeclTypeSpec::Logical) {
|
||||
if (context_.ShouldWarn(common::UsageWarning::LogicalVsCBool)) {
|
||||
msgs.Say(component.name(),
|
||||
"A LOGICAL component of an interoperable type should have the interoperable KIND=C_BOOL"_port_en_US);
|
||||
}
|
||||
} else if (type->category() == DeclTypeSpec::Character &&
|
||||
maybeDyType && maybeDyType->kind() == 1) {
|
||||
} else if (type->category() == DeclTypeSpec::Character && dyType &&
|
||||
dyType->kind() == 1) {
|
||||
if (context_.ShouldWarn(common::UsageWarning::BindCCharLength)) {
|
||||
msgs.Say(component.name(),
|
||||
"A CHARACTER component of an interoperable type should have length 1"_port_en_US);
|
||||
@ -3106,10 +3106,15 @@ parser::Messages CheckHelper::WhyNotInteroperableObject(const Symbol &symbol) {
|
||||
type->category() == DeclTypeSpec::Character &&
|
||||
type->characterTypeSpec().length().isDeferred()) {
|
||||
// ok; F'2023 18.3.7 p2(6)
|
||||
} else if (derived ||
|
||||
IsInteroperableIntrinsicType(*type, context_.languageFeatures())
|
||||
.value_or(false)) {
|
||||
} else if (derived) { // type has been checked
|
||||
} else if (auto dyType{evaluate::DynamicType::From(*type)}; dyType &&
|
||||
evaluate::IsInteroperableIntrinsicType(*dyType,
|
||||
InModuleFile() ? nullptr : &context_.languageFeatures())
|
||||
.value_or(false)) {
|
||||
// F'2023 18.3.7 p2(4,5)
|
||||
// N.B. Language features are not passed to IsInteroperableIntrinsicType
|
||||
// when processing a module file, since the module file might have been
|
||||
// compiled with CUDA while the client is not.
|
||||
} else if (type->category() == DeclTypeSpec::Logical) {
|
||||
if (context_.ShouldWarn(common::UsageWarning::LogicalVsCBool) &&
|
||||
!InModuleFile()) {
|
||||
|
@ -1956,7 +1956,7 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::ArrayConstructor &array) {
|
||||
|
||||
// Check if implicit conversion of expr to the symbol type is legal (if needed),
|
||||
// and make it explicit if requested.
|
||||
static MaybeExpr implicitConvertTo(const semantics::Symbol &sym,
|
||||
static MaybeExpr ImplicitConvertTo(const semantics::Symbol &sym,
|
||||
Expr<SomeType> &&expr, bool keepConvertImplicit) {
|
||||
if (!keepConvertImplicit) {
|
||||
return ConvertToType(sym, std::move(expr));
|
||||
@ -2196,7 +2196,7 @@ MaybeExpr ExpressionAnalyzer::Analyze(
|
||||
// convert would cause a segfault. Lowering will deal with
|
||||
// conditionally converting and preserving the lower bounds in this
|
||||
// case.
|
||||
if (MaybeExpr converted{implicitConvertTo(
|
||||
if (MaybeExpr converted{ImplicitConvertTo(
|
||||
*symbol, std::move(*value), IsAllocatable(*symbol))}) {
|
||||
if (auto componentShape{GetShape(GetFoldingContext(), *symbol)}) {
|
||||
if (auto valueShape{GetShape(GetFoldingContext(), *converted)}) {
|
||||
|
@ -893,13 +893,4 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &o, const DeclTypeSpec &x) {
|
||||
return o << x.AsFortran();
|
||||
}
|
||||
|
||||
std::optional<bool> IsInteroperableIntrinsicType(
|
||||
const DeclTypeSpec &type, const common::LanguageFeatureControl &features) {
|
||||
if (auto dyType{evaluate::DynamicType::From(type)}) {
|
||||
return IsInteroperableIntrinsicType(*dyType, &features);
|
||||
} else {
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Fortran::semantics
|
||||
|
4
flang/test/Semantics/Inputs/modfile66.cuf
Normal file
4
flang/test/Semantics/Inputs/modfile66.cuf
Normal file
@ -0,0 +1,4 @@
|
||||
module usereal2
|
||||
!REAL(2) is interoperable under CUDA
|
||||
real(2), bind(c) :: x
|
||||
end
|
3
flang/test/Semantics/modfile66.f90
Normal file
3
flang/test/Semantics/modfile66.f90
Normal file
@ -0,0 +1,3 @@
|
||||
! RUN: %flang_fc1 -fsyntax-only %S/Inputs/modfile66.cuf && %flang_fc1 -fsyntax-only %s
|
||||
use usereal2 ! valid since x is not used
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user