diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-04-13 00:14:39 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-04-13 00:14:39 +0000 |
| commit | 1f5a05bba183c9630a4a8588deaf5ac0f72f374f (patch) | |
| tree | 71930fdbbba7569c38241e5c6ec0447ef9b9acb3 | |
| parent | 6df95b7c45fe49916b5312d8ad218c332df8cd9a (diff) | |
| download | bcm5719-llvm-1f5a05bba183c9630a4a8588deaf5ac0f72f374f.tar.gz bcm5719-llvm-1f5a05bba183c9630a4a8588deaf5ac0f72f374f.zip | |
Work around MSVC rejects-valid bug related to C++11 narrowing conversions.
llvm-svn: 300144
| -rw-r--r-- | llvm/include/llvm/Option/ArgList.h | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/include/llvm/Option/ArgList.h b/llvm/include/llvm/Option/ArgList.h index 91baf4c8ac4..4ed28d7a852 100644 --- a/llvm/include/llvm/Option/ArgList.h +++ b/llvm/include/llvm/Option/ArgList.h @@ -162,6 +162,10 @@ protected: // Protect the dtor to ensure this type is never destroyed polymorphically. ~ArgList() = default; + // Implicitly convert a value to an OptSpecifier. Used to work around a bug + // in MSVC's implementation of narrowing conversion checking. + static OptSpecifier toOptSpecifier(OptSpecifier S) { return S; } + public: /// @name Arg Access /// @{ @@ -192,21 +196,23 @@ public: template<typename ...OptSpecifiers> iterator_range<filtered_iterator<sizeof...(OptSpecifiers)>> filtered(OptSpecifiers ...Ids) const { - OptRange Range = getRange({Ids...}); + OptRange Range = getRange({toOptSpecifier(Ids)...}); auto B = Args.begin() + Range.first; auto E = Args.begin() + Range.second; using Iterator = filtered_iterator<sizeof...(OptSpecifiers)>; - return make_range(Iterator(B, E, {Ids...}), Iterator(E, E, {Ids...})); + return make_range(Iterator(B, E, {toOptSpecifier(Ids)...}), + Iterator(E, E, {toOptSpecifier(Ids)...})); } template<typename ...OptSpecifiers> iterator_range<filtered_reverse_iterator<sizeof...(OptSpecifiers)>> filtered_reverse(OptSpecifiers ...Ids) const { - OptRange Range = getRange({Ids...}); + OptRange Range = getRange({toOptSpecifier(Ids)...}); auto B = Args.rend() - Range.second; auto E = Args.rend() - Range.first; using Iterator = filtered_reverse_iterator<sizeof...(OptSpecifiers)>; - return make_range(Iterator(B, E, {Ids...}), Iterator(E, E, {Ids...})); + return make_range(Iterator(B, E, {toOptSpecifier(Ids)...}), + Iterator(E, E, {toOptSpecifier(Ids)...})); } /// @} |

