diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2460,11 +2460,13 @@ if (TI.AlignIsRequired) return ABIAlign; - unsigned PreferredAlign = static_cast( - toBits(getASTRecordLayout(RT->getDecl()).PreferredAlignment)); - assert(PreferredAlign >= ABIAlign && - "PreferredAlign should be at least as large as ABIAlign."); - return PreferredAlign; + if (!RT->getDecl()->isInvalidDecl()) { + unsigned PreferredAlign = static_cast( + toBits(getASTRecordLayout(RT->getDecl()).PreferredAlignment)); + assert(PreferredAlign >= ABIAlign && + "PreferredAlign should be at least as large as ABIAlign."); + return PreferredAlign; + } } // Double (and, for targets supporting AIX `power` alignment, long double) and diff --git a/clang/test/SemaCXX/alignof.cpp b/clang/test/SemaCXX/alignof.cpp --- a/clang/test/SemaCXX/alignof.cpp +++ b/clang/test/SemaCXX/alignof.cpp @@ -102,3 +102,11 @@ template using template_alias = aligned_int; static_assert(alignof(template_alias) == 16, "Expected alignment of 16" ); + +namespace nocrash { +struct ForwardDecl; // expected-note {{forward declaration of}} +struct S { + ForwardDecl a; // expected-error {{field has incomplete type}} +}; +static_assert(__alignof__(S), ""); +}