From b656189e6a602aaf86714ccbf89d94f2ef05b644 Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Wed, 30 Sep 2020 16:14:12 -0500 Subject: [PATCH] [flang][msvc] Avoid ReferenceVariantBase ctor ambiguity. NFC. Msvc reports the following error when a ReferenceVariantBase is constructed using an r-value reference or instantiated as std::vector template parameter. The error message is: ``` PFTBuilder.h(59,1): error C2665: 'std::variant<...>::variant': none of the 2 overloads could convert all the argument types variant(1248,1): message : could be 'std::variant<...>::variant(std::variant<...> &&) noexcept(false)' variant(1248,1): message : or 'std::variant<...>::variant(const std::variant<...> &) noexcept(false)' PFTBuilder.h(59,1): message : while trying to match the argument list '(common::Reference>)' ``` Work around the ambiguity by only taking `common::Reference` arguments in the constructor. That is, conversion to common::Reference has to be done be the caller instead of being done inside the ctor. Unfortunately, with this change clang/gcc (but not msvc) insist on that the ReferenceVariantBase is stored in a `std::initializer_list`-initialized variable before being used, like being passed to a function or returned. This patch is part of the series to make flang compilable with MS Visual Studio . Reviewed By: DavidTruby Differential Revision: https://reviews.llvm.org/D88109 --- flang/include/flang/Lower/PFTBuilder.h | 5 +++-- flang/lib/Lower/PFTBuilder.cpp | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/flang/include/flang/Lower/PFTBuilder.h b/flang/include/flang/Lower/PFTBuilder.h index 3230d36..044e608 100644 --- a/flang/include/flang/Lower/PFTBuilder.h +++ b/flang/include/flang/Lower/PFTBuilder.h @@ -55,8 +55,9 @@ public: using Ref = common::Reference>; ReferenceVariantBase() = delete; - template - ReferenceVariantBase(B &b) : u{Ref{b}} {} + ReferenceVariantBase(std::variant...> b) : u(b) {} + template + ReferenceVariantBase(Ref b) : u(b) {} template constexpr BaseType &get() const { diff --git a/flang/lib/Lower/PFTBuilder.cpp b/flang/lib/Lower/PFTBuilder.cpp index 7195086..349f76e 100644 --- a/flang/lib/Lower/PFTBuilder.cpp +++ b/flang/lib/Lower/PFTBuilder.cpp @@ -64,8 +64,11 @@ struct UnwrapStmt> { class PFTBuilder { public: PFTBuilder(const semantics::SemanticsContext &semanticsContext) - : pgm{std::make_unique()}, - parentVariantStack{*pgm.get()}, semanticsContext{semanticsContext} {} + : pgm{std::make_unique()}, semanticsContext{ + semanticsContext} { + lower::pft::ParentVariant parent{*pgm.get()}; + parentVariantStack.push_back(parent); + } /// Get the result std::unique_ptr result() { return std::move(pgm); } @@ -905,11 +908,15 @@ private: template static lower::pft::FunctionLikeUnit::FunctionStatement getFunctionStmt(const T &func) { - return std::get>(func.t); + lower::pft::FunctionLikeUnit::FunctionStatement result{ + std::get>(func.t)}; + return result; } template static lower::pft::ModuleLikeUnit::ModuleStatement getModuleStmt(const T &mod) { - return std::get>(mod.t); + lower::pft::ModuleLikeUnit::ModuleStatement result{ + std::get>(mod.t)}; + return result; } static const semantics::Symbol *getSymbol( @@ -1078,7 +1085,8 @@ Fortran::lower::pft::FunctionLikeUnit::FunctionLikeUnit( const auto &ps{ std::get>>(func.t)}; if (ps.has_value()) { - beginStmt = ps.value(); + FunctionStatement begin{ps.value()}; + beginStmt = begin; symbol = getSymbol(beginStmt); processSymbolTable(*symbol->scope()); } else { -- 2.7.4