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.
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);
--- /dev/null
+// 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}}
+}
+