diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 4072550..07875c4 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -3424,15 +3424,18 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
     return OR_No_Viable_Function;
 
   const RecordType *T2RecordType = 0;
+  RecordDecl *T2RecordDecl = 0;
   if ((T2RecordType = T2->getAs<RecordType>()) &&
+      (T2RecordDecl = T2RecordType->getDecl()) &&
+      isa<CXXRecordDecl>(T2RecordDecl) &&
       !S.RequireCompleteType(Kind.getLocation(), T2, 0)) {
     // The type we're converting from is a class type, enumerate its conversion
     // functions.
-    CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
+    CXXRecordDecl *T2CXXRecordDecl = cast<CXXRecordDecl>(T2RecordDecl);
 
     std::pair<CXXRecordDecl::conversion_iterator,
               CXXRecordDecl::conversion_iterator>
-      Conversions = T2RecordDecl->getVisibleConversionFunctions();
+      Conversions = T2CXXRecordDecl->getVisibleConversionFunctions();
     for (CXXRecordDecl::conversion_iterator
            I = Conversions.first, E = Conversions.second; I != E; ++I) {
       NamedDecl *D = *I;
diff --git a/test/Sema/va_start_arm.c b/test/Sema/va_start_arm.c
new file mode 100644
index 0000000..f3be7f2
--- /dev/null
+++ b/test/Sema/va_start_arm.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -triple armv7 -verify %s
+typedef struct __va_list_tag {} __va_list_tag;
+
+void test(int n, ...) {
+    __va_list_tag ap1;
+    __builtin_va_start(ap1, n); // expected-error {{non-const lvalue reference to type '__builtin_va_list' cannot bind to a value of unrelated type '__va_list_tag' (aka 'struct __va_list_tag')}}
+}
