diff --git a/flang/include/flang/Lower/LoweringOptions.h b/flang/include/flang/Lower/LoweringOptions.h --- a/flang/include/flang/Lower/LoweringOptions.h +++ b/flang/include/flang/Lower/LoweringOptions.h @@ -21,14 +21,23 @@ /// If true, lower transpose without a runtime call. unsigned optimizeTranspose : 1; + /// If true, enable experimental feature. Off by default. + unsigned experimental : 1; + public: - LoweringOptions() : optimizeTranspose(true) {} + LoweringOptions() : optimizeTranspose(true), experimental(false) {} bool getOptimizeTranspose() const { return optimizeTranspose; } LoweringOptions &setOptimizeTranspose(bool v) { optimizeTranspose = v; return *this; } + + bool isExperimentalEnabled() const { return experimental; } + LoweringOptions &setExperimental(bool v) { + experimental = v; + return *this; + } }; } // namespace Fortran::lower diff --git a/flang/lib/Lower/CallInterface.cpp b/flang/lib/Lower/CallInterface.cpp --- a/flang/lib/Lower/CallInterface.cpp +++ b/flang/lib/Lower/CallInterface.cpp @@ -797,6 +797,12 @@ Fortran::common::TypeCategory cat = dynamicType.category(); // DERIVED if (cat == Fortran::common::TypeCategory::Derived) { + // TODO is kept under experimental flag until feature is complete. + if (dynamicType.IsPolymorphic() && + !getConverter().getLoweringOptions().isExperimentalEnabled()) + TODO(interface.converter.getCurrentLocation(), + "support for polymorphic types"); + if (dynamicType.IsUnlimitedPolymorphic()) return mlir::NoneType::get(&mlirContext); return getConverter().genType(dynamicType.GetDerivedTypeSpec()); diff --git a/flang/lib/Lower/ConvertType.cpp b/flang/lib/Lower/ConvertType.cpp --- a/flang/lib/Lower/ConvertType.cpp +++ b/flang/lib/Lower/ConvertType.cpp @@ -233,6 +233,10 @@ llvm::SmallVector params; translateLenParameters(params, tySpec->category(), ultimate); ty = genFIRType(context, tySpec->category(), kind, params); + } else if (type->IsPolymorphic() && + !converter.getLoweringOptions().isExperimentalEnabled()) { + // TODO is kept under experimental flag until feature is complete. + TODO(loc, "support for polymorphic types"); } else if (type->IsUnlimitedPolymorphic()) { ty = mlir::NoneType::get(context); } else if (const Fortran::semantics::DerivedTypeSpec *tySpec = diff --git a/flang/test/Lower/polymorphic-types.f90 b/flang/test/Lower/polymorphic-types.f90 --- a/flang/test/Lower/polymorphic-types.f90 +++ b/flang/test/Lower/polymorphic-types.f90 @@ -1,4 +1,4 @@ -! RUN: bbc -emit-fir %s -o - | FileCheck %s +! RUN: bbc -experimental -emit-fir %s -o - | FileCheck %s ! Tests the different possible type involving polymorphic entities. diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -126,6 +126,10 @@ llvm::cl::desc("enable openacc"), llvm::cl::init(false)); +static llvm::cl::opt + enableExperimental("experimental", llvm::cl::desc("enable experimental"), + llvm::cl::init(false)); + #define FLANG_EXCLUDE_CODEGEN #include "flang/Tools/CLOptions.inc" @@ -221,6 +225,7 @@ &ctx, llvm::ArrayRef{fir::fromDefaultKinds(defKinds)}); // Use default lowering options for bbc. Fortran::lower::LoweringOptions loweringOptions{}; + loweringOptions.setExperimental(enableExperimental); auto burnside = Fortran::lower::LoweringBridge::create( ctx, semanticsContext, defKinds, semanticsContext.intrinsics(), semanticsContext.targetCharacteristics(), parsing.allCooked(), "",