From adcd08fbf4d96f8f52cef81895bda202c9e45896 Mon Sep 17 00:00:00 2001
From: Andrey Lihatskiy <alihatskiy@productengine.com>
Date: Tue, 28 Sep 2021 19:07:48 +0300
Subject: [PATCH] Revert "Merge branch 'c++17' into DRTVWR-522-maint"

This reverts commit 203ea3a70a775a09cbbffb1740ab7c58f1780baa, reversing
changes made to 8e3f0778863a5aa337d1148a243ea91d238a8ac5.

# Conflicts:
#	indra/newview/llmachineid.cpp
---
 autobuild.xml                          |  14 +-
 indra/cmake/00-Common.cmake            |   5 +-
 indra/edit-me-to-trigger-new-build.txt |   2 +-
 indra/llcommon/llsd.h                  |  43 +++++
 indra/llcommon/llstl.h                 | 237 ++++++++++++++++++++++++-
 indra/llcommon/tests/llleap_test.cpp   |   2 +-
 indra/llinventory/llparcel.cpp         |   2 +-
 indra/llmessage/llcircuit.cpp          |  11 +-
 indra/llmessage/lldispatcher.cpp       |   2 +-
 indra/llmessage/llmessagethrottle.cpp  |  22 +++
 indra/llui/lldockablefloater.h         |   4 +-
 indra/newview/llappearancemgr.h        |   2 +-
 indra/newview/llexperiencelog.cpp      |   4 +
 indra/newview/llfavoritesbar.cpp       |   2 +-
 indra/newview/llfloaterregioninfo.cpp  |   4 +-
 indra/newview/llgesturemgr.cpp         |   2 +-
 indra/newview/lltoast.h                |   2 +-
 indra/newview/llwatchdog.cpp           |   4 +-
 indra/test/lldoubledispatch_tut.cpp    |   8 +-
 19 files changed, 338 insertions(+), 34 deletions(-)

diff --git a/autobuild.xml b/autobuild.xml
index e1e5c198711..5ad6f6293c5 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -308,9 +308,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f5a81594374c8a7f0825e2177510e079</string>
+              <string>02e6a8207dcdaf243dcb6da19b8c3534</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82030/770590/colladadom-2.3.559710-darwin64-559710.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64099/601302/colladadom-2.3.545362-darwin64-545362.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -344,9 +344,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>5d0729b835d63b7fe69acdc6b7c60188</string>
+              <string>8a02a10fc69c8f504dc5335644db184a</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82050/770692/colladadom-2.3.559710-windows-559710.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64104/601313/colladadom-2.3.545362-windows-545362.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -356,16 +356,16 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>985e3081e41c76b6176d39e44d7fb4b8</string>
+              <string>742180324fca7ab92b6a61a36aab4f9d</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82049/770686/colladadom-2.3.559710-windows64-559710.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64103/601314/colladadom-2.3.545362-windows64-545362.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.3.559710</string>
+        <string>2.3.545362</string>
       </map>
       <key>curl</key>
       <map>
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 0da530c6a2c..8aea50e02b1 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -66,8 +66,7 @@ if (WINDOWS)
   # CP changed to only append the flag for 32bit builds - on 64bit builds,
   # locally at least, the build output is spammed with 1000s of 'D9002'
   # warnings about this switch being ignored.
-  # We need std::string_view, but that's not available without /std:c++17.
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /std:c++17")  
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")  
   if( ADDRESS_SIZE EQUAL 32 )
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /p:PreferredToolArchitecture=x64")  
   endif()
@@ -176,7 +175,7 @@ if (DARWIN)
   # Until we decide to set -std=c++14 in viewer-build-variables/variables, set
   # it locally here: we want to at least prevent inadvertently reintroducing
   # viewer code that would fail with C++14.
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags} -std=c++17")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags} -std=c++14")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  ${DARWIN_extra_cstar_flags}")
   # NOTE: it's critical that the optimization flag is put in front.
   # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
index ade83202cf5..5366987cff8 100644
--- a/indra/edit-me-to-trigger-new-build.txt
+++ b/indra/edit-me-to-trigger-new-build.txt
@@ -1,3 +1,3 @@
 euclid 5/29/2020
 euclid 7/23/2020
-euclid 4/29/2021
+euclid 4/29/2021
\ No newline at end of file
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 6638b25feba..5b6d5545af1 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -413,6 +413,49 @@ class LL_COMMON_API LLSD
 	static std::string		typeString(Type type);		// Return human-readable type as a string
 };
 
+struct llsd_select_bool : public std::unary_function<LLSD, LLSD::Boolean>
+{
+	LLSD::Boolean operator()(const LLSD& sd) const
+	{
+		return sd.asBoolean();
+	}
+};
+struct llsd_select_integer : public std::unary_function<LLSD, LLSD::Integer>
+{
+	LLSD::Integer operator()(const LLSD& sd) const
+	{
+		return sd.asInteger();
+	}
+};
+struct llsd_select_real : public std::unary_function<LLSD, LLSD::Real>
+{
+	LLSD::Real operator()(const LLSD& sd) const
+	{
+		return sd.asReal();
+	}
+};
+struct llsd_select_float : public std::unary_function<LLSD, F32>
+{
+	F32 operator()(const LLSD& sd) const
+	{
+		return (F32)sd.asReal();
+	}
+};
+struct llsd_select_uuid : public std::unary_function<LLSD, LLSD::UUID>
+{
+	LLSD::UUID operator()(const LLSD& sd) const
+	{
+		return sd.asUUID();
+	}
+};
+struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
+{
+	LLSD::String operator()(const LLSD& sd) const
+	{
+		return sd.asString();
+	}
+};
+
 LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
 
 namespace llsd
diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h
index d28260b9f82..a90c2c7e087 100644
--- a/indra/llcommon/llstl.h
+++ b/indra/llcommon/llstl.h
@@ -40,6 +40,30 @@
 // <ND> For strcmp
 #include <string.h>
 #endif
+// Use to compare the first element only of a pair
+// e.g. typedef std::set<std::pair<int, Data*>, compare_pair<int, Data*> > some_pair_set_t; 
+template <typename T1, typename T2>
+struct compare_pair_first
+{
+	bool operator()(const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const
+	{
+		return a.first < b.first;
+	}
+};
+
+template <typename T1, typename T2>
+struct compare_pair_greater
+{
+	bool operator()(const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const
+	{
+		if (!(a.first < b.first))
+			return true;
+		else if (!(b.first < a.first))
+			return false;
+		else
+			return !(a.second < b.second);
+	}
+};
 
 // Use to compare the contents of two pointers (e.g. std::string*)
 template <typename T>
@@ -99,6 +123,58 @@ struct DeletePairedPointerArray
 };
 
 
+// Alternate version of the above so that has a more cumbersome
+// syntax, but it can be used with compositional functors.
+// NOTE: The functor retuns a bool because msdev bombs during the
+// composition if you return void. Once we upgrade to a newer
+// compiler, the second unary_function template parameter can be set
+// to void.
+//
+// Here's a snippet showing how you use this object:
+//
+// typedef std::map<int, widget*> map_type;
+// map_type widget_map;
+// ... // add elements
+// // delete them all
+// for_each(widget_map.begin(),
+//          widget_map.end(),
+//          llcompose1(DeletePointerFunctor<widget>(),
+//                     llselect2nd<map_type::value_type>()));
+
+template<typename T>
+struct DeletePointerFunctor : public std::unary_function<T*, bool>
+{
+	bool operator()(T* ptr) const
+	{
+		delete ptr;
+		return true;
+	}
+};
+
+// See notes about DeleteArray for why you should consider avoiding this.
+template<typename T>
+struct DeleteArrayFunctor : public std::unary_function<T*, bool>
+{
+	bool operator()(T* ptr) const
+	{
+		delete[] ptr;
+		return true;
+	}
+};
+
+// CopyNewPointer is a simple helper which accepts a pointer, and
+// returns a new pointer built with the copy constructor. Example:
+//
+//  transform(in.begin(), in.end(), out.end(), CopyNewPointer());
+
+struct CopyNewPointer
+{
+	template<typename T> T* operator()(const T* ptr) const
+	{
+		return new T(*ptr);
+	}
+};
+
 template<typename T, typename ALLOC>
 void delete_and_clear(std::list<T*, ALLOC>& list)
 {
@@ -287,6 +363,161 @@ OutputIter ll_transform_n(
 }
 
 
+
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+
+// helper to deal with the fact that MSDev does not package
+// select... with the stl. Look up usage on the sgi website.
+
+template <class _Pair>
+struct _LLSelect1st : public std::unary_function<_Pair, typename _Pair::first_type> {
+  const typename _Pair::first_type& operator()(const _Pair& __x) const {
+    return __x.first;
+  }
+};
+
+template <class _Pair>
+struct _LLSelect2nd : public std::unary_function<_Pair, typename _Pair::second_type>
+{
+  const typename _Pair::second_type& operator()(const _Pair& __x) const {
+    return __x.second;
+  }
+};
+
+template <class _Pair> struct llselect1st : public _LLSelect1st<_Pair> {};
+template <class _Pair> struct llselect2nd : public _LLSelect2nd<_Pair> {};
+
+// helper to deal with the fact that MSDev does not package
+// compose... with the stl. Look up usage on the sgi website.
+
+template <class _Operation1, class _Operation2>
+class ll_unary_compose :
+	public std::unary_function<typename _Operation2::argument_type,
+							   typename _Operation1::result_type>
+{
+protected:
+  _Operation1 __op1;
+  _Operation2 __op2;
+public:
+  ll_unary_compose(const _Operation1& __x, const _Operation2& __y)
+    : __op1(__x), __op2(__y) {}
+  typename _Operation1::result_type
+  operator()(const typename _Operation2::argument_type& __x) const {
+    return __op1(__op2(__x));
+  }
+};
+
+template <class _Operation1, class _Operation2>
+inline ll_unary_compose<_Operation1,_Operation2>
+llcompose1(const _Operation1& __op1, const _Operation2& __op2)
+{
+  return ll_unary_compose<_Operation1,_Operation2>(__op1, __op2);
+}
+
+template <class _Operation1, class _Operation2, class _Operation3>
+class ll_binary_compose
+  : public std::unary_function<typename _Operation2::argument_type,
+							   typename _Operation1::result_type> {
+protected:
+  _Operation1 _M_op1;
+  _Operation2 _M_op2;
+  _Operation3 _M_op3;
+public:
+  ll_binary_compose(const _Operation1& __x, const _Operation2& __y,
+					const _Operation3& __z)
+    : _M_op1(__x), _M_op2(__y), _M_op3(__z) { }
+  typename _Operation1::result_type
+  operator()(const typename _Operation2::argument_type& __x) const {
+    return _M_op1(_M_op2(__x), _M_op3(__x));
+  }
+};
+
+template <class _Operation1, class _Operation2, class _Operation3>
+inline ll_binary_compose<_Operation1, _Operation2, _Operation3>
+llcompose2(const _Operation1& __op1, const _Operation2& __op2,
+         const _Operation3& __op3)
+{
+  return ll_binary_compose<_Operation1,_Operation2,_Operation3>
+    (__op1, __op2, __op3);
+}
+
+// helpers to deal with the fact that MSDev does not package
+// bind... with the stl. Again, this is from sgi.
+template <class _Operation>
+class llbinder1st :
+	public std::unary_function<typename _Operation::second_argument_type,
+							   typename _Operation::result_type> {
+protected:
+  _Operation op;
+  typename _Operation::first_argument_type value;
+public:
+  llbinder1st(const _Operation& __x,
+			  const typename _Operation::first_argument_type& __y)
+      : op(__x), value(__y) {}
+	typename _Operation::result_type
+	operator()(const typename _Operation::second_argument_type& __x) const {
+		return op(value, __x);
+	}
+};
+
+template <class _Operation, class _Tp>
+inline llbinder1st<_Operation>
+llbind1st(const _Operation& __oper, const _Tp& __x)
+{
+  typedef typename _Operation::first_argument_type _Arg1_type;
+  return llbinder1st<_Operation>(__oper, _Arg1_type(__x));
+}
+
+template <class _Operation>
+class llbinder2nd
+	: public std::unary_function<typename _Operation::first_argument_type,
+								 typename _Operation::result_type> {
+protected:
+	_Operation op;
+	typename _Operation::second_argument_type value;
+public:
+	llbinder2nd(const _Operation& __x,
+				const typename _Operation::second_argument_type& __y)
+		: op(__x), value(__y) {}
+	typename _Operation::result_type
+	operator()(const typename _Operation::first_argument_type& __x) const {
+		return op(__x, value);
+	}
+};
+
+template <class _Operation, class _Tp>
+inline llbinder2nd<_Operation>
+llbind2nd(const _Operation& __oper, const _Tp& __x)
+{
+  typedef typename _Operation::second_argument_type _Arg2_type;
+  return llbinder2nd<_Operation>(__oper, _Arg2_type(__x));
+}
+
 /**
  * Compare std::type_info* pointers a la std::less. We break this out as a
  * separate function for use in two different std::less specializations.
@@ -317,7 +548,8 @@ bool before(const std::type_info* lhs, const std::type_info* rhs)
 namespace std
 {
 	template <>
-	struct less<const std::type_info*>
+	struct less<const std::type_info*>:
+		public std::binary_function<const std::type_info*, const std::type_info*, bool>
 	{
 		bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
 		{
@@ -326,7 +558,8 @@ namespace std
 	};
 
 	template <>
-	struct less<std::type_info*>
+	struct less<std::type_info*>:
+		public std::binary_function<std::type_info*, std::type_info*, bool>
 	{
 		bool operator()(std::type_info* lhs, std::type_info* rhs) const
 		{
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index fd96aa01d53..9d71e327d88 100644
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -530,7 +530,7 @@ namespace tut
         result.ensure();
     }
 
-    struct TestLargeMessage
+    struct TestLargeMessage: public std::binary_function<size_t, size_t, bool>
     {
         TestLargeMessage(const std::string& PYTHON_, const std::string& reader_module_,
                          const std::string& test_name_):
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 2f577bfb079..e2469f3c7e6 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -1268,5 +1268,5 @@ U32 LLParcel::countExperienceKeyType( U32 type )
 	return std::count_if(
 		boost::begin(mExperienceKeys | boost::adaptors::map_values), 
 		boost::end(mExperienceKeys | boost::adaptors::map_values), 
-		[type](U32 key){ return key == type; });
+		std::bind2nd(std::equal_to<U32>(), type));
 }
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index a39989515e6..8baa2e328b9 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -436,11 +436,12 @@ LLCircuit::LLCircuit(const F32Seconds circuit_heartbeat_interval, const F32Secon
 
 LLCircuit::~LLCircuit()
 {
-    // delete pointers in the map.
-    for (auto circ_pair : mCircuitData)
-    {
-        delete circ_pair.second;
-    }
+	// delete pointers in the map.
+	std::for_each(mCircuitData.begin(),
+				  mCircuitData.end(),
+				  llcompose1(
+					  DeletePointerFunctor<LLCircuitData>(),
+					  llselect2nd<circuit_data_map::value_type>()));
 }
 
 LLCircuitData *LLCircuit::addCircuitData(const LLHost &host, TPACKETID in_id)
diff --git a/indra/llmessage/lldispatcher.cpp b/indra/llmessage/lldispatcher.cpp
index 8dfd924f311..717ef10f702 100644
--- a/indra/llmessage/lldispatcher.cpp
+++ b/indra/llmessage/lldispatcher.cpp
@@ -62,7 +62,7 @@ void LLDispatcher::copyAllHandlerNames(keys_t& names) const
 		mHandlers.begin(),
 		mHandlers.end(),
 		std::back_insert_iterator<keys_t>(names),
-		[](const dispatch_map_t::value_type& pair){ return pair.first; });
+		llselect1st<dispatch_map_t::value_type>());
 }
 
 bool LLDispatcher::dispatch(
diff --git a/indra/llmessage/llmessagethrottle.cpp b/indra/llmessage/llmessagethrottle.cpp
index c5ae8b45474..579d6d71878 100644
--- a/indra/llmessage/llmessagethrottle.cpp
+++ b/indra/llmessage/llmessagethrottle.cpp
@@ -32,8 +32,18 @@
 #include "llframetimer.h"
 
 // This is used for the stl search_n function.
+#if _MSC_VER >= 1500 // VC9 has a bug in search_n
+struct eq_message_throttle_entry : public std::binary_function< LLMessageThrottleEntry, LLMessageThrottleEntry, bool >
+{
+	bool operator()(const LLMessageThrottleEntry& a, const LLMessageThrottleEntry& b) const
+	{
+		return a.getHash() == b.getHash();
+	}
+};
+#else
 bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b)
  		{ return a.getHash() == b.getHash(); }
+#endif
 
 const U64 SEC_TO_USEC = 1000000;
 		
@@ -108,8 +118,14 @@ BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const std::string& mesg
 	LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
 	// Check if this message is already in the list.
+#if _MSC_VER >= 1500 // VC9 has a bug in search_n
+	// SJB: This *should* work but has not been tested yet *TODO: Test!
+	message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(),
+												 std::bind2nd(eq_message_throttle_entry(), entry));
+#else
  	message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
  												  1, entry, eq_message_throttle_entry);
+#endif
 	if (found == message_list->end())
 	{
 		// This message was not found.  Add it to the list.
@@ -136,8 +152,14 @@ BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, c
 	LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
 	// Check if this message is already in the list.
+#if _MSC_VER >= 1500 // VC9 has a bug in search_n
+	// SJB: This *should* work but has not been tested yet *TODO: Test!
+	message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(),
+												 std::bind2nd(eq_message_throttle_entry(), entry));
+#else
 	message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
 												  1, entry, eq_message_throttle_entry);
+#endif
 	
 	if (found == message_list->end())
 	{
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 1110342f086..89c9852f4af 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -108,7 +108,7 @@ class LLDockableFloater : public LLFloater
 	 *
 	 * By default returns false.
 	 */
-	virtual bool overlapsScreenChannel() const { return mOverlapsScreenChannel && getVisible() && isDocked(); }
+	virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }
 	virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }
 
 	bool getUniqueDocking() { return mUniqueDocking;	}
@@ -131,7 +131,7 @@ class LLDockableFloater : public LLFloater
 	boost::function<BOOL ()> mIsDockedStateForcedCallback;
 
 private:
-	std::unique_ptr<LLDockControl> mDockControl;
+	std::auto_ptr<LLDockControl> mDockControl;
 	LLUIImagePtr mDockTongue;
 	static LLHandle<LLFloater> sInstanceHandle;
 	/**
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index a5265a392f8..8a55a848db4 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -276,7 +276,7 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 	
 	LLUUID mCOFImageID;
 
-	std::unique_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
+	std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
 
 	// Set of temp attachment UUIDs that should be removed
 	typedef std::set<LLUUID> doomed_temp_attachments_t;
diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp
index c441fbc09fb..ee5d5619277 100644
--- a/indra/newview/llexperiencelog.cpp
+++ b/indra/newview/llexperiencelog.cpp
@@ -149,6 +149,10 @@ std::string LLExperienceLog::getPermissionString( const LLSD& message, const std
 		{
 			buf.str(entry);
 		}
+		else
+		{
+			buf.str();
+		}
 	}
 
 	if(buf.str().empty())
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index a7147c3f046..cca6b9ce32b 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -841,7 +841,7 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)
 		{
 			//find last visible child to get the rightest button offset
 			child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(), 
-					[](child_list_t::value_type child){ return child->getVisible(); });
+					std::mem_fun(&LLView::getVisible));
 			if(last_visible_it != childs->rend())
 			{
 				last_right_edge = (*last_visible_it)->getRect().mRight;
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index a10ba7a39dd..17e55b5f2ca 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -659,7 +659,9 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
 	std::for_each(
 		mInfoPanels.begin(),
 		mInfoPanels.end(),
-		[region](info_panels_t::value_type panel){ panel->refreshFromRegion(region); });
+		llbind2nd(
+			std::mem_fun(&LLPanelRegionInfo::refreshFromRegion),
+			region));
     mEnvironmentPanel->refreshFromRegion(region);
 }
 
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index eb0e77311b9..950a6cfaef5 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -752,7 +752,7 @@ S32 LLGestureMgr::getPlayingCount() const
 }
 
 
-struct IsGesturePlaying
+struct IsGesturePlaying : public std::unary_function<LLMultiGesture*, bool>
 {
 	bool operator()(const LLMultiGesture* gesture) const
 	{
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 2b1fedf74d1..69074b16705 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -222,7 +222,7 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>
 	LLPanel*	 mWrapperPanel;
 
 	// timer counts a lifetime of a toast
-	std::unique_ptr<LLToastLifeTimer> mTimer;
+	std::auto_ptr<LLToastLifeTimer> mTimer;
 
 	F32			mToastLifetime; // in seconds
 	F32			mToastFadingTime; // in seconds
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index a3036ff6d06..0aa0280b257 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -224,7 +224,7 @@ void LLWatchdog::run()
 		LL_INFOS() << "Watchdog thread delayed: resetting entries." << LL_ENDL;
 		std::for_each(mSuspects.begin(), 
 			mSuspects.end(), 
-			[](SuspectsRegistry::value_type suspect){ suspect->reset(); }
+			std::mem_fun(&LLWatchdogEntry::reset)
 			);
 	}
 	else
@@ -232,7 +232,7 @@ void LLWatchdog::run()
 		SuspectsRegistry::iterator result = 
 			std::find_if(mSuspects.begin(), 
 				mSuspects.end(), 
-				[](SuspectsRegistry::value_type suspect){ return ! suspect->isAlive(); }
+				std::not1(std::mem_fun(&LLWatchdogEntry::isAlive))
 				);
 		if(result != mSuspects.end())
 		{
diff --git a/indra/test/lldoubledispatch_tut.cpp b/indra/test/lldoubledispatch_tut.cpp
index e38d0e92a37..ad8f6454d4c 100644
--- a/indra/test/lldoubledispatch_tut.cpp
+++ b/indra/test/lldoubledispatch_tut.cpp
@@ -135,10 +135,10 @@ namespace tut
 
         // Instantiate a few GameObjects.  Make sure we refer to them
         // polymorphically, and don't let them leak.
-        std::unique_ptr<GameObject> home;
-        std::unique_ptr<GameObject> obstacle;
-        std::unique_ptr<GameObject> tug;
-        std::unique_ptr<GameObject> patrol;
+        std::auto_ptr<GameObject> home;
+        std::auto_ptr<GameObject> obstacle;
+        std::auto_ptr<GameObject> tug;
+        std::auto_ptr<GameObject> patrol;
 
         // prototype objects
         Asteroid dummyAsteroid;
-- 
GitLab