diff -uNr boost_1_63_0/boost/archive/archive_exception.hpp boost_1_63_0/boost/archive/archive_exception.hpp
--- boost_1_63_0/boost/archive/archive_exception.hpp	2016-12-22 07:33:19.000000000 -0500
+++ boost_1_63_0/boost/archive/archive_exception.hpp	2017-06-01 22:07:26.013983567 -0400
@@ -42,13 +42,6 @@
 class BOOST_SYMBOL_VISIBLE archive_exception : 
     public virtual std::exception
 {
-private:
-    char m_buffer[128];
-protected:
-    BOOST_ARCHIVE_DECL unsigned int
-    append(unsigned int l, const char * a);
-    BOOST_ARCHIVE_DECL
-    archive_exception() BOOST_NOEXCEPT;
 public:
     typedef enum {
         no_exception,       // initialized without code
@@ -90,6 +83,15 @@
     BOOST_ARCHIVE_DECL archive_exception(archive_exception const &) BOOST_NOEXCEPT ;
     virtual BOOST_ARCHIVE_DECL ~archive_exception() BOOST_NOEXCEPT_OR_NOTHROW ;
     virtual BOOST_ARCHIVE_DECL const char * what() const BOOST_NOEXCEPT_OR_NOTHROW ;
+protected:
+    BOOST_ARCHIVE_DECL unsigned int
+    append(unsigned int l, const char * a);
+    BOOST_ARCHIVE_DECL
+    archive_exception() BOOST_NOEXCEPT;
+private:
+    char m_buffer[128];
+    BOOST_ARCHIVE_DECL void
+    pgi_bug_workaround_init(archive_exception *, const char *, const char *);
 };
 
 }// namespace archive
diff -uNr boost_1_63_0/boost/archive/xml_archive_exception.hpp boost_1_63_0/boost/archive/xml_archive_exception.hpp
--- boost_1_63_0/boost/archive/xml_archive_exception.hpp	2016-12-22 07:33:19.000000000 -0500
+++ boost_1_63_0/boost/archive/xml_archive_exception.hpp	2017-05-31 21:02:03.373700156 -0400
@@ -47,6 +47,9 @@
     );
     BOOST_ARCHIVE_DECL xml_archive_exception(xml_archive_exception const &) ;
     virtual BOOST_ARCHIVE_DECL ~xml_archive_exception() BOOST_NOEXCEPT_OR_NOTHROW ;
+private:
+    BOOST_ARCHIVE_DECL void
+    pgi_bug_workaround_init_xml(xml_archive_exception *, exception_code, const char *, const char *);
 };
 
 }// namespace archive
diff -uNr boost_1_63_0/libs/serialization/src/archive_exception.cpp boost_1_63_0/libs/serialization/src/archive_exception.cpp
--- boost_1_63_0/libs/serialization/src/archive_exception.cpp	2016-12-22 07:33:19.000000000 -0500
+++ boost_1_63_0/libs/serialization/src/archive_exception.cpp	2017-06-01 22:06:14.193128909 -0400
@@ -37,83 +37,90 @@
 }
 
 BOOST_ARCHIVE_DECL
-archive_exception::archive_exception(
-    exception_code c, 
-    const char * e1,
-    const char * e2
-) BOOST_NOEXCEPT :
-    code(c)
+void 
+archive_exception::pgi_bug_workaround_init(archive_exception *new_object, const char *e1, const char *e2)
 {
     unsigned int length = 0;
-    switch(code){
+    switch(new_object->code){
     case no_exception:
-        length = append(length, "uninitialized exception");
+        length = new_object->append(length, "uninitialized exception");
         break;
-    case unregistered_class:
-        length = append(length, "unregistered class");
+    case archive_exception::unregistered_class:
+        length = new_object->append(length, "unregistered class");
         if(NULL != e1){
-            length = append(length, " - ");
-            length = append(length, e1);
+            length = new_object->append(length, " - ");
+            length = new_object->append(length, e1);
         }    
         break;
     case invalid_signature:
-        length = append(length, "invalid signature");
+        length = new_object->append(length, "invalid signature");
         break;
     case unsupported_version:
-        length = append(length, "unsupported version");
+        length = new_object->append(length, "unsupported version");
         break;
     case pointer_conflict:
-        length = append(length, "pointer conflict");
+        length = new_object->append(length, "pointer conflict");
         break;
     case incompatible_native_format:
-        length = append(length, "incompatible native format");
+        length = new_object->append(length, "incompatible native format");
         if(NULL != e1){
-            length = append(length, " - ");
-            length = append(length, e1);
+            length = new_object->append(length, " - ");
+            length = new_object->append(length, e1);
         }    
         break;
     case array_size_too_short:
-        length = append(length, "array size too short");
+        length = new_object->append(length, "array size too short");
         break;
     case input_stream_error:
-        length = append(length, "input stream error");
+        length = new_object->append(length, "input stream error");
         break;
     case invalid_class_name:
-        length = append(length, "class name too long");
+        length = new_object->append(length, "class name too long");
         break;
     case unregistered_cast:
-        length = append(length, "unregistered void cast ");
-        length = append(length, (NULL != e1) ? e1 : "?");
-        length = append(length, "<-");
-        length = append(length, (NULL != e2) ? e2 : "?");
+        length = new_object->append(length, "unregistered void cast ");
+        length = new_object->append(length, (NULL != e1) ? e1 : "?");
+        length = new_object->append(length, "<-");
+        length = new_object->append(length, (NULL != e2) ? e2 : "?");
         break;
     case unsupported_class_version:
-        length = append(length, "class version ");
-        length = append(length, (NULL != e1) ? e1 : "<unknown class>");
+        length = new_object->append(length, "class version ");
+        length = new_object->append(length, (NULL != e1) ? e1 : "<unknown class>");
         break;
     case other_exception:
         // if get here - it indicates a derived exception 
         // was sliced by passing by value in catch
-        length = append(length, "unknown derived exception");
+        length = new_object->append(length, "unknown derived exception");
         break;
     case multiple_code_instantiation:
-        length = append(length, "code instantiated in more than one module");
+        length = new_object->append(length, "code instantiated in more than one module");
         if(NULL != e1){
-            length = append(length, " - ");
-            length = append(length, e1);
+            length = new_object->append(length, " - ");
+            length = new_object->append(length, e1);
         }    
         break;
     case output_stream_error:
-        length = append(length, "output stream error");
+        length = new_object->append(length, "output stream error");
         break;
     default:
         BOOST_ASSERT(false);
-        length = append(length, "programming error");
+        length = new_object->append(length, "programming error");
         break;
     }
 }
 
 BOOST_ARCHIVE_DECL
+archive_exception::archive_exception(
+    exception_code c, 
+    const char * e1,
+    const char * e2
+) BOOST_NOEXCEPT :
+    code(c)
+{
+    pgi_bug_workaround_init(this, e1, e2);
+}
+
+BOOST_ARCHIVE_DECL
 archive_exception::archive_exception(archive_exception const & oth) BOOST_NOEXCEPT :
 	std::exception(oth),
 	code(oth.code)
diff -uNr boost_1_63_0/libs/serialization/src/xml_archive_exception.cpp boost_1_63_0/libs/serialization/src/xml_archive_exception.cpp
--- boost_1_63_0/libs/serialization/src/xml_archive_exception.cpp	2016-12-22 07:33:19.000000000 -0500
+++ boost_1_63_0/libs/serialization/src/xml_archive_exception.cpp	2017-05-31 20:58:15.650876427 -0400
@@ -26,41 +26,48 @@
 namespace archive {
 
 BOOST_ARCHIVE_DECL
+void 
+xml_archive_exception::pgi_bug_workaround_init_xml(xml_archive_exception *new_object, exception_code c, const char *e1, const char *e2)
+{
+    switch(c){
+    case xml_archive_parsing_error:
+        new_object->append(0, "unrecognized XML syntax");
+        break;
+    case xml_archive_tag_mismatch:{
+        unsigned int l;
+        l = new_object->append(0, "XML start/end tag mismatch");
+        if(NULL != e1){
+            l = new_object->append(l, " - ");
+            new_object->append(l, e1);
+        }    
+        break;
+    }
+    case xml_archive_tag_name_error:
+        new_object->append(0, "Invalid XML tag name");
+        break;
+    default:
+        BOOST_ASSERT(false);
+        new_object->append(0, "programming error");
+        break;
+    }
+}
+
+BOOST_ARCHIVE_DECL
 xml_archive_exception::xml_archive_exception(
         exception_code c, 
         const char * e1,
         const char * e2
     ) : 
         archive_exception(other_exception, e1, e2)
-    {
-        switch(c){
-        case xml_archive_parsing_error:
-            archive_exception::append(0, "unrecognized XML syntax");
-            break;
-        case xml_archive_tag_mismatch:{
-            unsigned int l;
-            l = archive_exception::append(0, "XML start/end tag mismatch");
-            if(NULL != e1){
-                l = archive_exception::append(l, " - ");
-                archive_exception::append(l, e1);
-            }    
-            break;
-        }
-        case xml_archive_tag_name_error:
-            archive_exception::append(0, "Invalid XML tag name");
-            break;
-        default:
-            BOOST_ASSERT(false);
-            archive_exception::append(0, "programming error");
-            break;
-        }
-    }
+{
+    pgi_bug_workaround_init_xml(this, c, e1, e2);
+}
     
 BOOST_ARCHIVE_DECL
 xml_archive_exception::xml_archive_exception(xml_archive_exception const & oth) :
  	archive_exception(oth)
-	{
-	}
+{
+}
 	
 BOOST_ARCHIVE_DECL xml_archive_exception::~xml_archive_exception() BOOST_NOEXCEPT_OR_NOTHROW {}
 
