Index: cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp @@ -84,6 +84,13 @@ if (!VD || VD->getType()->isReferenceType()) return true; + // Don't warn when target type has no definition. + if (const RecordType *RD = dyn_cast(ToPointeeTy.getTypePtr())) { + if (!RD->getDecl()->getDefinition()) { + return true; + } + } + // Warn when there is widening cast. unsigned ToWidth = Ctx.getTypeInfo(ToPointeeTy).Width; unsigned OrigWidth = Ctx.getTypeInfo(OrigPointeeTy).Width; Index: cfe/trunk/test/Analysis/cast-to-struct.cpp =================================================================== --- cfe/trunk/test/Analysis/cast-to-struct.cpp +++ cfe/trunk/test/Analysis/cast-to-struct.cpp @@ -65,3 +65,8 @@ void *VP = P; Abc = (struct ABC *)VP; } + +// https://llvm.org/bugs/show_bug.cgi?id=31173 +void dontCrash(struct AB X) { + struct UndefS *S = (struct UndefS *)&X; +}