diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5776,6 +5776,8 @@ checkAIXMemberAlignment((Arg->getExprLoc()), Arg); QualType ParamTy = Proto->getParamType(ArgIdx); + if (ParamTy->containsErrors()) + continue; QualType ArgTy = Arg->getType(); CheckArgAlignment(Arg->getExprLoc(), FDecl, std::to_string(ArgIdx + 1), ArgTy, ParamTy); diff --git a/clang/test/SemaCXX/recovery-expr-type.cpp b/clang/test/SemaCXX/recovery-expr-type.cpp --- a/clang/test/SemaCXX/recovery-expr-type.cpp +++ b/clang/test/SemaCXX/recovery-expr-type.cpp @@ -162,3 +162,15 @@ b = __builtin_object_size(c, 0); // crash2 } } + +namespace test15 { +const UnknownType SZ = 8; // expected-error {{unknown type}} +typedef unsigned char UC; +void f() { + struct { + void m(UC (&)[SZ]) {} + } S; + unsigned char A[8]; + S.m(A); // no crash +} +}