From 95b2dab199100f5a86d3f73a995afea879886d65 Mon Sep 17 00:00:00 2001 From: Erik Pilkington Date: Tue, 15 Dec 2020 17:00:20 -0500 Subject: [PATCH] [Sema] Fix a miscompile by retaining array qualifiers when folding VLAs to constant arrays rdar://72243125 Differential revision: https://reviews.llvm.org/D93247 --- clang/lib/Sema/SemaDecl.cpp | 5 +++-- clang/test/SemaObjC/arc.m | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 0031f87..6c438f3 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5965,8 +5965,9 @@ static QualType TryToFixInvalidVariablyModifiedType(QualType T, return QualType(); } - return Context.getConstantArrayType(ElemTy, Res, VLATy->getSizeExpr(), - ArrayType::Normal, 0); + QualType FoldedArrayType = Context.getConstantArrayType( + ElemTy, Res, VLATy->getSizeExpr(), ArrayType::Normal, 0); + return Qs.apply(Context, FoldedArrayType); } static void diff --git a/clang/test/SemaObjC/arc.m b/clang/test/SemaObjC/arc.m index fe5db9c..bcd2f99 100644 --- a/clang/test/SemaObjC/arc.m +++ b/clang/test/SemaObjC/arc.m @@ -839,3 +839,15 @@ void block_capture_autoreleasing(A * __autoreleasing *a, (void)*l; }(); } + +void test_vla_fold_keeps_strong(void) { + const unsigned bounds = 1; + + static id array[bounds]; // expected-warning {{variable length array folded to constant array as an extension}} + typedef __typeof__(array) array_type; + typedef id __strong array_type[1]; + + static id weak_array[bounds] __weak; // expected-warning {{variable length array folded to constant array as an extension}} + typedef __typeof__(weak_array) weak_array_type; + typedef id __weak weak_array_type[1]; +} -- 2.7.4