llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-clangd Author: Ilya Biryukov (ilya-biryukov) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/80300.diff 2 Files Affected: - (modified) clang/lib/AST/ASTContext.cpp (+2-1) - (modified) clang/test/SemaCXX/datasizeof.cpp (+8) ``````````diff 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); +} `````````` </details> https://github.com/llvm/llvm-project/pull/80300 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits