зеркало из https://github.com/microsoft/clang-1.git
When evaluating variably modified types for function parameters, dig out the
type as written from the ParmVarDecl; it's unclear whether the standard (C99 6.9.1p10) requires this, but we're following the precedent set by gcc, and hopefully nobody will ever ask about this again. PR9559 / <rdar://problem/12621983>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167985 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
825d386c1d
Коммит
f5bf912767
|
@ -454,7 +454,16 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
|
|||
// emit the type size.
|
||||
for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
|
||||
i != e; ++i) {
|
||||
QualType Ty = (*i)->getType();
|
||||
const VarDecl *VD = *i;
|
||||
|
||||
// Dig out the type as written from ParmVarDecls; it's unclear whether
|
||||
// the standard (C99 6.9.1p10) requires this, but we're following the
|
||||
// precedent set by gcc.
|
||||
QualType Ty;
|
||||
if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
|
||||
Ty = PVD->getOriginalType();
|
||||
else
|
||||
Ty = VD->getType();
|
||||
|
||||
if (Ty->isVariablyModifiedType())
|
||||
EmitVariablyModifiedType(Ty);
|
||||
|
|
|
@ -190,4 +190,8 @@ void test6(void)
|
|||
// CHECK-NEXT: store i32 0, i32* [[IX2]], align 4
|
||||
}
|
||||
|
||||
|
||||
// Follow gcc's behavior for VLAs in parameter lists. PR9559.
|
||||
void test7(int a[b(0)]) {
|
||||
// CHECK: define void @test7(
|
||||
// CHECK: call i32 @b(i8* null)
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче