From: Richard Smith Date: Thu, 13 Apr 2017 00:14:39 +0000 (+0000) Subject: Work around MSVC rejects-valid bug related to C++11 narrowing conversions. X-Git-Tag: llvmorg-5.0.0-rc1~7860 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1f5a05bba183c9630a4a8588deaf5ac0f72f374f;p=platform%2Fupstream%2Fllvm.git Work around MSVC rejects-valid bug related to C++11 narrowing conversions. llvm-svn: 300144 --- diff --git a/llvm/include/llvm/Option/ArgList.h b/llvm/include/llvm/Option/ArgList.h index 91baf4c8..4ed28d7 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 iterator_range> 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; - 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 iterator_range> 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; - return make_range(Iterator(B, E, {Ids...}), Iterator(E, E, {Ids...})); + return make_range(Iterator(B, E, {toOptSpecifier(Ids)...}), + Iterator(E, E, {toOptSpecifier(Ids)...})); } /// @}