From: Aaron Ballman Date: Mon, 18 Oct 2021 17:59:07 +0000 (-0400) Subject: Fix crash when diagnosing a CTAD failure in an array new expression X-Git-Tag: upstream/15.0.7~28314 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5b949a649aff0406a878e8eb8d7d5efba0a55e4a;p=platform%2Fupstream%2Fllvm.git Fix crash when diagnosing a CTAD failure in an array new expression This appears to be a think-o where the developer was trying to check for a null pointer but was actually checking (redundantly) whether the optional held a valid value or not. We now properly check the pointer for null. This fixes PR51547. --- diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 6b09136..0f3f50c 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1967,10 +1967,10 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, if (Deduced && isa(Deduced)) { if (ArraySize) return ExprError( - Diag(ArraySize ? (*ArraySize)->getExprLoc() : TypeRange.getBegin(), + Diag(*ArraySize ? (*ArraySize)->getExprLoc() : TypeRange.getBegin(), diag::err_deduced_class_template_compound_type) << /*array*/ 2 - << (ArraySize ? (*ArraySize)->getSourceRange() : TypeRange)); + << (*ArraySize ? (*ArraySize)->getSourceRange() : TypeRange)); InitializedEntity Entity = InitializedEntity::InitializeNew(StartLoc, AllocType); diff --git a/clang/test/SemaCXX/new-delete-array.cpp b/clang/test/SemaCXX/new-delete-array.cpp new file mode 100644 index 0000000..fca1ec1 --- /dev/null +++ b/clang/test/SemaCXX/new-delete-array.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++17 %s -verify=cxx17 +// RUN: %clang_cc1 -fsyntax-only -std=c++14 %s -verify=cxx14 + +namespace PR51547 { +template struct A; // cxx14-note {{template is declared here}} +auto p = new A[]{}; // cxx14-error {{use of class template 'A' requires template arguments}} \ + cxx17-error {{cannot form array of deduced class template specialization type}} +} +