Merge pull request #1760 from escherstair/fix_ce6_support

fix _BitScanReverse() usage for CE6
diff --git a/include/rapidjson/internal/clzll.h b/include/rapidjson/internal/clzll.h
index 6cd7923..47bb7ab 100644
--- a/include/rapidjson/internal/clzll.h
+++ b/include/rapidjson/internal/clzll.h
@@ -17,7 +17,7 @@
 
 #include "../rapidjson.h"
 
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) && !defined(UNDER_CE)
 #include <intrin.h>
 #if defined(_WIN64)
 #pragma intrinsic(_BitScanReverse64)
@@ -34,7 +34,7 @@
     // infinite loop in the software implementation.
     RAPIDJSON_ASSERT(x != 0);
 
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) && !defined(UNDER_CE)
     unsigned long r = 0;
 #if defined(_WIN64)
     _BitScanReverse64(&r, x);
@@ -53,7 +53,7 @@
     return static_cast<uint32_t>(__builtin_clzll(x));
 #else
     // naive version
-    uint32_t r;
+    uint32_t r = 0;
     while (!(x & (static_cast<uint64_t>(1) << 63))) {
         x <<= 1;
         ++r;
diff --git a/test/unittest/CMakeLists.txt b/test/unittest/CMakeLists.txt
index 072b7b1..fc8803e 100644
--- a/test/unittest/CMakeLists.txt
+++ b/test/unittest/CMakeLists.txt
@@ -3,6 +3,7 @@
 set(UNITTEST_SOURCES
 	allocatorstest.cpp
     bigintegertest.cpp
+    clzlltest.cpp
 	cursorstreamwrappertest.cpp
     documenttest.cpp
     dtoatest.cpp
diff --git a/test/unittest/clzlltest.cpp b/test/unittest/clzlltest.cpp
new file mode 100644
index 0000000..a5b3e2e
--- /dev/null
+++ b/test/unittest/clzlltest.cpp
@@ -0,0 +1,34 @@
+// Tencent is pleased to support the open source community by making RapidJSON available.
+// 
+// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+//
+// Licensed under the MIT License (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
+//
+// http://opensource.org/licenses/MIT
+//
+// Unless required by applicable law or agreed to in writing, software distributed 
+// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
+// CONDITIONS OF ANY KIND, either express or implied. See the License for the 
+// specific language governing permissions and limitations under the License.
+
+#include "unittest.h"
+#include "rapidjson/internal/clzll.h"
+
+#ifdef __GNUC__
+RAPIDJSON_DIAG_PUSH
+#endif
+
+using namespace rapidjson::internal;
+
+TEST(clzll, normal) {
+    EXPECT_EQ(clzll(1), 63U);
+    EXPECT_EQ(clzll(2), 62U);
+    EXPECT_EQ(clzll(12), 60U);
+    EXPECT_EQ(clzll(0x0000000080000001UL), 32U);
+    EXPECT_EQ(clzll(0x8000000000000001UL), 0U);
+}
+
+#ifdef __GNUC__
+RAPIDJSON_DIAG_POP
+#endif