Merge branch 'SirR4T-patch-1'
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 3c0eef3..cefd22d 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -887,6 +887,17 @@
             break;

         }

 

+        XMLDeclaration* decl = node->ToDeclaration();

+        if ( decl ) {

+                // A declaration can only be the first child of a document.

+                // Set error, if document already has children.

+                if ( !_document->NoChildren() ) {

+                        _document->SetError( XML_ERROR_PARSING_DECLARATION, decl->Value(), 0);

+                        DeleteNode( decl );

+                        break;

+                }

+        }

+

         XMLElement* ele = node->ToElement();

         if ( ele ) {

             // We read the end tag. Return it to the parent.

@@ -1846,7 +1857,7 @@
         return _errorID;

     }

 

-    if ( filelength >= (size_t)-1 ) {

+    if ( (size_t)filelength >= (size_t)-1 ) {

         // Cannot handle files which won't fit in buffer together with null terminator

         SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );

         return _errorID;

diff --git a/xmltest.cpp b/xmltest.cpp
index b70fc51..f3fa7b2 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -1460,6 +1460,25 @@
 		XMLTest( "Error should be cleared", false, doc.Error() );

 	}

 

+	{

+		// Check that declarations are parsed only as the FirstChild

+                const char* xml0 = "<?xml version=\"1.0\" ?>"

+                                   "   <!-- xml version=\"1.1\" -->"

+                                   "<first />";

+                const char* xml1 = "<?xml version=\"1.0\" ?>"

+                                   "   <?xml version=\"1.1\" ?>"

+                                   "<first />";

+                const char* xml2 = "<first />"

+                                   "<?xml version=\"1.0\" ?>";

+                XMLDocument doc;

+                doc.Parse(xml0);

+                XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false);

+                doc.Parse(xml1);

+                XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);

+                doc.Parse(xml2);

+                XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);

+	}

+

 	// ----------- Performance tracking --------------

 	{

 #if defined( _MSC_VER )