[clang] [Clang] Fix assertion failure in getASTRecordLayout for invalid declarations (PR #208153)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 15 06:16:09 PDT 2026
================
@@ -3384,9 +3384,30 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
// not a complete definition (which is what isCompleteDefinition() tests)
// until we *finish* parsing the definition.
D = D->getDefinition();
- assert(D && "Cannot get layout of forward declarations!");
- assert(!D->isInvalidDecl() && "Cannot get layout of invalid decl!");
- assert(D->isCompleteDefinition() && "Cannot layout type before complete!");
+
+ // Handle invalid declarations gracefully during error recovery
+ // This can happen when there are template specialization errors
+ if (!D || D->isInvalidDecl() || !D->isCompleteDefinition()) {
+ // Check if we already have a cached layout
+ const ASTRecordLayout *Entry = ASTRecordLayouts[D];
+ if (Entry)
+ return *Entry;
+
+ // Create a minimal safe layout for error recovery
----------------
AaronBallman wrote:
This kind of error recovery seems like it may end up causing some really weird follow-on diagnostics. e.g., imagine an erroneous declaration of a struct type which is then used in a `sizeof` in `static_assert`, that kind of thing.
Are we sure this is the best form of recovery? Would it make more sense to update the interface so that it can report failures and callers have to be prepared to fail gracefully?
I'm not exactly opposed to the current direction, mostly just thinking through the implications and troubles it may cause.
CC @vgvassilev for additional opinions because I expect clang-repl can hit these kinds of failures
https://github.com/llvm/llvm-project/pull/208153
More information about the cfe-commits
mailing list