Check whether the allocated type is an array type before calling
authorAkira Hatanaka <ahatanaka@apple.com>
Mon, 26 Sep 2022 21:19:53 +0000 (14:19 -0700)
committerAkira Hatanaka <ahatanaka@apple.com>
Mon, 26 Sep 2022 21:21:21 +0000 (14:21 -0700)
checkArrayElementAlignment in Sema::BuildCXXNew

This commit fixes a bug that was introduced by adaf62ced and reported
here: https://reviews.llvm.org/D133711#3814717

clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/array-alignment.cpp

index 3e65b3e..d6d8a74 100644 (file)
@@ -2079,6 +2079,9 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
   if (CheckAllocatedType(AllocType, TypeRange.getBegin(), TypeRange))
     return ExprError();
 
+  if (ArraySize && !checkArrayElementAlignment(AllocType, TypeRange.getBegin()))
+    return ExprError();
+
   // In ARC, infer 'retaining' for the allocated
   if (getLangOpts().ObjCAutoRefCount &&
       AllocType.getObjCLifetime() == Qualifiers::OCL_None &&
@@ -2449,8 +2452,6 @@ bool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc,
   else if (RequireNonAbstractType(Loc, AllocType,
                                   diag::err_allocation_of_abstract_type))
     return true;
-  else if (!checkArrayElementAlignment(AllocType, Loc))
-    return true;
   else if (AllocType->isVariablyModifiedType())
     return Diag(Loc, diag::err_variably_modified_new_type)
              << AllocType;
index e6ff005..d98d773 100644 (file)
@@ -33,4 +33,5 @@ void test(char *p) {
   auto p3 = new AlignedStruct[1];
   auto p4 = (AlignedPackedStruct(*)[1])p; // expected-error {{size of array element}}
   auto p5 = new AlignedPackedStruct[1]; // expected-error {{size of array element}}
+  auto p6 = new AlignedPackedStruct;
 }