llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Mital Ashok (MitalAshok) <details> <summary>Changes</summary> Fixes #<!-- -->78183 Just removed the check entirely. The diagnostic issued for trying to initialize an array (`array initializer must be an initializer list`) is much clearer (than `array 'new' cannot have initialization arguments`). --- Full diff: https://github.com/llvm/llvm-project/pull/78201.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+3) - (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (-2) - (modified) clang/lib/Sema/SemaExprCXX.cpp (-29) - (modified) clang/test/SemaCXX/new-delete.cpp (+11-10) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 7e130304c5c08f..a2e757defb3c7f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -937,6 +937,9 @@ Bug Fixes to AST Handling - Fixed a bug where Template Instantiation failed to handle Lambda Expressions with certain types of Attributes. (`#76521 <https://github.com/llvm/llvm-project/issues/76521>`_) +- Fixed a bug where the parenthesized initialization of arrays in a new + expression were rejected even in C++20 mode. + (`#78183 <https://github.com/llvm/llvm-project/issues/78183>`_) Miscellaneous Bug Fixes ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 414779a7970ab8..920edebfb70333 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7776,8 +7776,6 @@ def err_new_array_nonconst : Error< "only the first dimension of an allocated array may have dynamic size">; def err_new_array_size_unknown_from_init : Error< "cannot determine allocated array size from initializer">; -def err_new_array_init_args : Error< - "array 'new' cannot have initialization arguments">; def ext_new_paren_array_nonconst : ExtWarn< "when type is in parentheses, array cannot have dynamic size">; def err_placement_new_non_placement_delete : Error< diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 4ae04358d5df7c..efb917f9bcd504 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1946,25 +1946,6 @@ Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, Initializer); } -static bool isLegalArrayNewInitializer(CXXNewInitializationStyle Style, - Expr *Init) { - if (!Init) - return true; - if (ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) - return PLE->getNumExprs() == 0; - if (isa<ImplicitValueInitExpr>(Init)) - return true; - else if (CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) - return !CCE->isListInitialization() && - CCE->getConstructor()->isDefaultConstructor(); - else if (Style == CXXNewInitializationStyle::List) { - assert(isa<InitListExpr>(Init) && - "Shouldn't create list CXXConstructExprs for arrays."); - return true; - } - return false; -} - bool Sema::isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const { if (!getLangOpts().AlignedAllocationUnavailable) @@ -2400,16 +2381,6 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, } } - // Array 'new' can't have any initializers except empty parentheses. - // Initializer lists are also allowed, in C++11. Rely on the parser for the - // dialect distinction. - if (ArraySize && !isLegalArrayNewInitializer(InitStyle, Initializer)) { - SourceRange InitRange(Exprs.front()->getBeginLoc(), - Exprs.back()->getEndLoc()); - Diag(StartLoc, diag::err_new_array_init_args) << InitRange; - return ExprError(); - } - // If we can perform the initialization, and we've not already done so, // do it now. if (!AllocType->isDependentType() && diff --git a/clang/test/SemaCXX/new-delete.cpp b/clang/test/SemaCXX/new-delete.cpp index 0270e42b7389fe..07a8495a35f756 100644 --- a/clang/test/SemaCXX/new-delete.cpp +++ b/clang/test/SemaCXX/new-delete.cpp @@ -1,7 +1,8 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++98 -// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++11 -// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++14 -// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx17 %s -triple=i686-pc-linux-gnu -Wno-new-returns-null %std_cxx17- +// RUN: %clang_cc1 -fsyntax-only -verify=expected,until-cxx20 %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++98 +// RUN: %clang_cc1 -fsyntax-only -verify=expected,until-cxx20 %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++11 +// RUN: %clang_cc1 -fsyntax-only -verify=expected,until-cxx20 %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++14 +// RUN: %clang_cc1 -fsyntax-only -verify=expected,until-cxx20,cxx17 %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++17 +// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx17 %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++20 // FIXME Location is (frontend) // cxx17-note@*:* {{candidate function not viable: requires 2 arguments, but 3 were provided}} @@ -340,23 +341,23 @@ namespace PR5918 { // Look for template operator new overloads. namespace Test1 { void f() { - (void)new int[10](1, 2); // expected-error {{array 'new' cannot have initialization arguments}} + (void)new int[10](1, 2); // until-cxx20-error {{array initializer must be an initializer list}} typedef int T[10]; - (void)new T(1, 2); // expected-error {{array 'new' cannot have initialization arguments}} + (void)new T(1, 2); // until-cxx20-error {{array initializer must be an initializer list}} } template<typename T> void g(unsigned i) { - (void)new T[1](i); // expected-error {{array 'new' cannot have initialization arguments}} + (void)new T[1](i); } template<typename T> void h(unsigned i) { - (void)new T(i); // expected-error {{array 'new' cannot have initialization arguments}} + (void)new T(i); // until-cxx20-error {{array initializer must be an initializer list}} } template void h<unsigned>(unsigned); -template void h<unsigned[10]>(unsigned); // expected-note {{in instantiation of function template specialization 'Test1::h<unsigned int[10]>' requested here}} +template void h<unsigned[10]>(unsigned); // until-cxx20-note {{in instantiation of function template specialization 'Test1::h<unsigned int[10]>' requested here}} } @@ -556,7 +557,7 @@ namespace P12023 { int main() { - CopyCounter* f = new CopyCounter[10](CopyCounter()); // expected-error {{cannot have initialization arguments}} + CopyCounter* f = new CopyCounter[10](CopyCounter()); // until-cxx20-error {{array initializer must be an initializer list}} return 0; } } `````````` </details> https://github.com/llvm/llvm-project/pull/78201 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits