From: Alexey Bataev Date: Mon, 25 Jan 2016 05:14:03 +0000 (+0000) Subject: Fixed processing of GNU extensions to C99 designated initializers X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5687ebd4705286bed1fd99d47511a4fa1b39cdaa;p=clang Fixed processing of GNU extensions to C99 designated initializers Clang did not handles correctly inner parts of arrays/structures initializers in GNU extensions to C99 designated initializers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@258668 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index c3a89463dc..c60ea865aa 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -2276,7 +2276,7 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, FieldType, nullptr, nullptr, Index, StructuredList, newStructuredIndex, - true, false)) + FinishSubobjectInit, false)) return true; } @@ -2467,11 +2467,11 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, Index = OldIndex; ElementEntity.setElementIndex(ElementIndex); - if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, - ElementType, nullptr, nullptr, Index, - StructuredList, ElementIndex, - (DesignatedStartIndex == DesignatedEndIndex), - false)) + if (CheckDesignatedInitializer( + ElementEntity, IList, DIE, DesigIdx + 1, ElementType, nullptr, + nullptr, Index, StructuredList, ElementIndex, + FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex), + false)) return true; // Move to the next index in the array that we'll be initializing. diff --git a/test/CodeGen/init.c b/test/CodeGen/init.c index a2b492013d..5d086723cc 100644 --- a/test/CodeGen/init.c +++ b/test/CodeGen/init.c @@ -1,5 +1,16 @@ // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s +struct I { int k[3]; }; +struct M { struct I o[2]; }; +struct M v1[1] = { [0].o[0 ... 1].k[0 ... 1] = 4, 5 }; +unsigned v2[2][3] = {[0 ... 1][0 ... 1] = 2222, 3333}; + +// CHECK-DAG: %struct.M = type { [2 x %struct.I] } +// CHECK-DAG: %struct.I = type { [3 x i32] } + +// CHECK: [1 x %struct.M] [%struct.M { [2 x %struct.I] [%struct.I { [3 x i32] [i32 4, i32 4, i32 0] }, %struct.I { [3 x i32] [i32 4, i32 4, i32 5] }] }], +// CHECK: [2 x [3 x i32]] {{[[][[]}}3 x i32] [i32 2222, i32 2222, i32 0], [3 x i32] [i32 2222, i32 2222, i32 3333]], + void f1() { // Scalars in braces. int a = { 1 };