[flang][msvc] Avoid ReferenceVariantBase ctor ambiguity. NFC.
authorMichael Kruse <llvm-project@meinersbur.de>
Wed, 30 Sep 2020 21:14:12 +0000 (16:14 -0500)
committerMichael Kruse <llvm-project@meinersbur.de>
Thu, 1 Oct 2020 01:54:09 +0000 (20:54 -0500)
commitb656189e6a602aaf86714ccbf89d94f2ef05b644
tree8930c34284e8af79cadf23540e36c0c23348052b
parent196c097bba8b0b3932f3fcdcd5310f78ebaa43a3
[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<lower::pft::ReferenceVariantBase<false,...>>)'
```

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 <http://lists.llvm.org/pipermail/flang-dev/2020-July/000448.html>.

Reviewed By: DavidTruby

Differential Revision: https://reviews.llvm.org/D88109
flang/include/flang/Lower/PFTBuilder.h
flang/lib/Lower/PFTBuilder.cpp