diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index feece493ffbe58121b88e1c634f730d03ad90244..0706ef466d9bfd9b8ea2ecbbe15d67b19853d2e6 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -4516,6 +4516,22 @@ namespace std
 }
 #endif
 
+#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
+namespace std
+{
+	// Workarounds for (non-standard) iterator category detection
+	std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+
+	std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+}
+#endif
+
 /**
  * Copyright (c) 2006-2010 Arseny Kapoulkine
  *
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 9b0edddf8c1a80e4b50f714c3d82bfa8d394e169..f57dba2eb046a17a1b4c7ff96ae8451accbbb8b5 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -21,12 +21,21 @@ namespace std
 {
 	struct bidirectional_iterator_tag;
 
+#ifdef __SUNPRO_CC
+	// Sun C++ compiler has a bug which forces template argument names in forward declarations to be the same as in actual definitions
+	template <class _T> class allocator;
+	template <class _charT> struct char_traits;
+	template <class _charT, class _Traits> class basic_istream;
+	template <class _charT, class _Traits> class basic_ostream;
+	template <class _charT, class _Traits, class _Allocator> class basic_string;
+#else
 	// Borland C++ compiler has a bug which forces template argument names in forward declarations to be the same as in actual definitions
 	template <class _Ty> class allocator;
 	template <class _Ty> struct char_traits;
 	template <class _Elem, class _Traits> class basic_istream;
 	template <class _Elem, class _Traits> class basic_ostream;
 	template <class _Elem, class _Traits, class _Ax> class basic_string;
+#endif
 
 	// Digital Mars compiler has a bug which requires a forward declaration for explicit instantiation (otherwise type selection is messed up later, producing link errors)
 	// Also note that we have to declare char_traits as a class here, since it's defined that way
@@ -2330,6 +2339,15 @@ namespace std
 }
 #endif
 
+#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
+namespace std
+{
+	// Workarounds for (non-standard) iterator category detection
+	std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&);
+	std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&);
+}
+#endif
+
 #endif
 
 /**
diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp
index d11a7ca77943e3942f24f15aba0e9e88f6c99e84..d409655f3d886782538f53b4ac2576280a0899c2 100644
--- a/src/pugixpath.cpp
+++ b/src/pugixpath.cpp
@@ -768,7 +768,7 @@ namespace pugi
 	{
 		if (begin == end) return;
 
-		size_t count = std::distance(begin, end);
+		size_t count = end - begin;
 		size_t size = m_end - m_begin;
 		size_t capacity = m_eos - m_begin;