Fix crash when diagnosing a CTAD failure in an array new expression
authorAaron Ballman <aaron@aaronballman.com>
Mon, 18 Oct 2021 17:59:07 +0000 (13:59 -0400)
committerAaron Ballman <aaron@aaronballman.com>
Mon, 18 Oct 2021 18:01:55 +0000 (14:01 -0400)
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.

clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/new-delete-array.cpp [new file with mode: 0644]

index 6b09136..0f3f50c 100644 (file)
@@ -1967,10 +1967,10 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
   if (Deduced && isa<DeducedTemplateSpecializationType>(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 (file)
index 0000000..fca1ec1
--- /dev/null
@@ -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<class> 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}}
+}
+