зеркало из https://github.com/microsoft/clang-1.git
implement a tiny amount of codegen support for gnu array range
designators: allowing codegen when the element initializer is a constant or something else without a side effect. This unblocks enough to let process.c in the linux kernel build, PR9257. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126056 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
944ed3b8db
Коммит
e0fd832b07
|
@ -1593,14 +1593,19 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
|
|||
} else {
|
||||
assert(D->isArrayRangeDesignator() && "Need array-range designator");
|
||||
|
||||
|
||||
DesignatedStartIndex =
|
||||
DIE->getArrayRangeStart(*D)->EvaluateAsInt(SemaRef.Context);
|
||||
DesignatedEndIndex =
|
||||
DIE->getArrayRangeEnd(*D)->EvaluateAsInt(SemaRef.Context);
|
||||
IndexExpr = DIE->getArrayRangeEnd(*D);
|
||||
|
||||
if (DesignatedStartIndex.getZExtValue() !=DesignatedEndIndex.getZExtValue())
|
||||
// Codegen can't handle evaluating array range designators that have side
|
||||
// effects, because we replicate the AST value for each initialized element.
|
||||
// As such, set the sawArrayRangeDesignator() bit if we initialize multiple
|
||||
// elements with something that has a side effect, so codegen can emit an
|
||||
// "error unsupported" error instead of miscompiling the app.
|
||||
if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
|
||||
DIE->getInit()->HasSideEffects(SemaRef.Context))
|
||||
FullyStructuredList->sawArrayRangeDesignator();
|
||||
}
|
||||
|
||||
|
|
|
@ -100,3 +100,18 @@ int test10(int X) {
|
|||
// CHECK-NOT: store i32 0
|
||||
// CHECK: call void @bar
|
||||
}
|
||||
|
||||
|
||||
// PR9257
|
||||
struct test11S {
|
||||
int A[10];
|
||||
};
|
||||
void test11(struct test11S *P) {
|
||||
*P = (struct test11S) { .A = { [0 ... 3] = 4 } };
|
||||
// CHECK: @test11
|
||||
// CHECK: store i32 4
|
||||
// CHECK: store i32 4
|
||||
// CHECK: store i32 4
|
||||
// CHECK: store i32 4
|
||||
// CHECK: ret void
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче