From 9d4558de2b2ba9fc1ad7e8c797880afc93c790d7 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Mon, 11 Dec 2017 16:28:58 +0400
Subject: [PATCH] Fix build in Visual Studio 15.5.1.

Looks like compiler had some regressions when updating from 15.4.5.

Range-V3-VS2015 also needs to cherry-pick this commit:
https://github.com/ericniebler/range-v3/commit/9f990c48d0
See https://github.com/Microsoft/Range-V3-VS2015/issues/26
---
 Telegram/SourceFiles/boxes/peer_list_box.h    |  8 +++----
 .../info/profile/info_profile_cover.cpp       | 24 +++++++++++++++----
 Telegram/gyp/settings_win.gypi                |  4 ++--
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/Telegram/SourceFiles/boxes/peer_list_box.h b/Telegram/SourceFiles/boxes/peer_list_box.h
index 3982d5d41..07cf310cc 100644
--- a/Telegram/SourceFiles/boxes/peer_list_box.h
+++ b/Telegram/SourceFiles/boxes/peer_list_box.h
@@ -715,10 +715,10 @@ public:
 	}
 	void peerListSortRows(
 			base::lambda<bool(const PeerListRow &a, const PeerListRow &b)> compare) override {
-		_content->reorderRows([compare = std::move(compare)](
+		_content->reorderRows([&](
 				auto &&begin,
 				auto &&end) {
-			std::sort(begin, end, [&compare](auto &&a, auto &&b) {
+			std::sort(begin, end, [&](auto &&a, auto &&b) {
 				return compare(*a, *b);
 			});
 		});
@@ -726,10 +726,10 @@ public:
 	int peerListPartitionRows(
 			base::lambda<bool(const PeerListRow &a)> border) override {
 		auto result = 0;
-		_content->reorderRows([border = std::move(border), &result](
+		_content->reorderRows([&](
 				auto &&begin,
 				auto &&end) {
-			auto edge = std::stable_partition(begin, end, [&border](
+			auto edge = std::stable_partition(begin, end, [&](
 					auto &&current) {
 				return border(*current);
 			});
diff --git a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp
index bf3a6b919..56cd1d08c 100644
--- a/Telegram/SourceFiles/info/profile/info_profile_cover.cpp
+++ b/Telegram/SourceFiles/info/profile/info_profile_cover.cpp
@@ -260,10 +260,18 @@ Cover::Cover(
 
 void Cover::setupChildGeometry() {
 	using namespace rpl::mappers;
+	//
+	// Visual Studio 2017 15.5.1 internal compiler error here.
+	// See https://developercommunity.visualstudio.com/content/problem/165155/ice-regression-in-1551-after-successfull-build-in.html
+	//
+	//rpl::combine(
+	//	toggleShownValue(),
+	//	widthValue(),
+	//	_2)
 	rpl::combine(
 		toggleShownValue(),
-		widthValue(),
-		_2)
+		widthValue())
+		| rpl::map([](bool shown, int width) { return width; })
 		| rpl::start_with_next([this](int newWidth) {
 			_userpic->moveToLeft(
 				st::infoProfilePhotoLeft,
@@ -449,10 +457,18 @@ void SharedMediaCover::createLabel() {
 		Lang::Viewer(lng_profile_shared_media) | ToUpperValue(),
 		st::infoBlockHeaderLabel);
 	label->setAttribute(Qt::WA_TransparentForMouseEvents);
+	//
+	// Visual Studio 2017 15.5.1 internal compiler error here.
+	// See https://developercommunity.visualstudio.com/content/problem/165155/ice-regression-in-1551-after-successfull-build-in.html
+	//
+	//rpl::combine(
+	//	toggleShownValue(),
+	//	widthValue(),
+	//	_2)
 	rpl::combine(
 		toggleShownValue(),
-		widthValue(),
-		_2)
+		widthValue())
+		| rpl::map([](bool shown, int width) { return width; })
 		| rpl::start_with_next([this, weak = label.data()](int newWidth) {
 			auto availableWidth = newWidth
 				- st::infoBlockHeaderPosition.x()
diff --git a/Telegram/gyp/settings_win.gypi b/Telegram/gyp/settings_win.gypi
index be93f25a6..898e9c463 100644
--- a/Telegram/gyp/settings_win.gypi
+++ b/Telegram/gyp/settings_win.gypi
@@ -35,12 +35,12 @@
         'VCCLCompilerTool': {
           'ProgramDataBaseFileName': '$(OutDir)\\$(ProjectName).pdb',
           'DebugInformationFormat': '3',          # Program Database (/Zi)
+          'WarnAsError': 'true',
           'AdditionalOptions': [
             '/std:c++latest',
-			'/permissive-',
+            '/permissive-',
             '/MP',     # Enable multi process build.
             '/EHsc',   # Catch C++ exceptions only, extern C functions never throw a C++ exception.
-            '/WX',     # Treat warnings as errors.
             '/w14834', # [[nodiscard]]
           ],
           'TreatWChar_tAsBuiltInType': 'false',