https://github.com/ilya-biryukov created https://github.com/llvm/llvm-project/pull/80300
Fixes #80284. Calling `getASTRecordLayout` on invalid types may crash and results of `__datasizeof` on invalid types can be arbitrary, so just use whatever `sizeof` returns. >From beeedb29d4dd1213d754cccefaf52cd0658a92d3 Mon Sep 17 00:00:00 2001 From: Ilya Biryukov <ibiryu...@google.com> Date: Thu, 1 Feb 2024 16:12:23 +0100 Subject: [PATCH] [Sema] Fix crash in __datasizeof with unknown types Fixes #80284. Calling `getASTRecordLayout` on invalid types may crash and results of `__datasizeof` on invalid types can be arbitrary, so just use whatever `sizeof` returns. --- clang/lib/AST/ASTContext.cpp | 3 ++- clang/test/SemaCXX/datasizeof.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d9cefcaa84d7e..4bfc433d2d1e5 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1745,7 +1745,8 @@ TypeInfoChars ASTContext::getTypeInfoDataSizeInChars(QualType T) const { // of a base-class subobject. We decide whether that's possible // during class layout, so here we can just trust the layout results. if (getLangOpts().CPlusPlus) { - if (const auto *RT = T->getAs<RecordType>()) { + if (const auto *RT = T->getAs<RecordType>(); + RT && !RT->getDecl()->isInvalidDecl()) { const ASTRecordLayout &layout = getASTRecordLayout(RT->getDecl()); Info.Width = layout.getDataSize(); } diff --git a/clang/test/SemaCXX/datasizeof.cpp b/clang/test/SemaCXX/datasizeof.cpp index f96660d2028d0..5baf2ecb24ed7 100644 --- a/clang/test/SemaCXX/datasizeof.cpp +++ b/clang/test/SemaCXX/datasizeof.cpp @@ -51,3 +51,11 @@ struct S { }; static_assert(S{}.i == 9); + +namespace GH80284 { +struct Bar; // expected-note{{forward declaration}} +struct Foo { + Bar x; // expected-error{{field has incomplete type}} +}; +constexpr int a = __datasizeof(Foo); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits