diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5965,8 +5965,9 @@ 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 --- a/clang/test/SemaObjC/arc.m +++ b/clang/test/SemaObjC/arc.m @@ -839,3 +839,15 @@ (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]; +}