Author: Podchishchaeva, Mariya Date: 2023-08-29T06:50:32-07:00 New Revision: bcc881161aeb56ea5a38858fe0007e59f21042c4
URL: https://github.com/llvm/llvm-project/commit/bcc881161aeb56ea5a38858fe0007e59f21042c4 DIFF: https://github.com/llvm/llvm-project/commit/bcc881161aeb56ea5a38858fe0007e59f21042c4.diff LOG: [clang] Emit an error if variable ends up with incomplete array type This adds an error if variable with incomplete type has initializer with incomplete type, so it is not possible to deduce array size from initializer. Fixes https://github.com/llvm/llvm-project/issues/37257 Reviewed By: aaron.ballman, shafik Differential Revision: https://reviews.llvm.org/D158615 Added: clang/test/SemaCXX/gh37257.cpp Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDecl.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index deb53303a21b44..9cd95005d7e059 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -189,6 +189,9 @@ Bug Fixes in This Version (`#64876 <https://github.com/llvm/llvm-project/issues/64876>`_) - Fixed an assertion if a function has cleanups and fatal erors. (`#48974 <https://github.com/llvm/llvm-project/issues/48974>`_) +- Clang now emits an error if it is not possible to deduce array size for a + variable with incomplete array type. + (`#37257 <https://github.com/llvm/llvm-project/issues/37257>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 664af4ccf4c635..18355b484975af 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -13445,6 +13445,18 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { IsParenListInit = !InitSeq.steps().empty() && InitSeq.step_begin()->Kind == InitializationSequence::SK_ParenthesizedListInit; + QualType VDeclType = VDecl->getType(); + if (Init && !Init->getType().isNull() && + !Init->getType()->isDependentType() && !VDeclType->isDependentType() && + Context.getAsIncompleteArrayType(VDeclType) && + Context.getAsIncompleteArrayType(Init->getType())) { + // Bail out if it is not possible to deduce array size from the + // initializer. + Diag(VDecl->getLocation(), diag::err_typecheck_decl_incomplete_type) + << VDeclType; + VDecl->setInvalidDecl(); + return; + } } // Check for self-references within variable initializers. diff --git a/clang/test/SemaCXX/gh37257.cpp b/clang/test/SemaCXX/gh37257.cpp new file mode 100644 index 00000000000000..ebcd32d18f69da --- /dev/null +++ b/clang/test/SemaCXX/gh37257.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); // expected-error{{variable has incomplete type 'int[]'}} + (void) t; +} + +struct A; + +int main() { + test<int[]>(); // expected-note {{in instantiation of function template specialization 'test<int[]>' requested here}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits