From: Steve Naroff Date: Mon, 10 Sep 2007 22:17:00 +0000 (+0000) Subject: Fix the following bug submitted by Justin Handville. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=08d51393bfa55a0b7d99db2b2a59f1df7d3f4f68;p=clang Fix the following bug submitted by Justin Handville. int main(int argc, char* argv[]) { return 0; } After speaking briefly with Chris, we decided this should be a front-end fix. The fix...have Sema::GetTypeForDeclarator() do the default function/array conversion, as I outlined in the 9/9 email on this topic. Since this conversion is done before Sema::ParseParamDeclarator(), I thought I could remove the conversion from Sema::ParseParamDeclarator(). Unfortunately, this didn't work. The conversion apparently needs to be done in both places (which doesn't make sense to me). Will investigate. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41811 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp index 75f07d8d54..bf8d48b553 100644 --- a/Sema/SemaType.cpp +++ b/Sema/SemaType.cpp @@ -261,11 +261,28 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) { for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) { QualType ArgTy = QualType::getFromOpaquePtr(FTI.ArgInfo[i].TypeInfo); assert(!ArgTy.isNull() && "Couldn't parse type?"); - + // + // Perform the default function/array conversion (C99 6.7.5.3p[7,8]). + // This matches the conversion that is done in + // Sema::ParseParamDeclarator(). Without this conversion, the + // argument type in the function prototype *will not* match the + // type in ParmVarDecl (which makes the code generator unhappy). + // + // FIXME: We still apparently need the conversion in + // Sema::ParseParamDeclarator(). This doesn't make any sense, since + // it should be driving off the type being created here. + // + // FIXME: If a source translation tool needs to see the original type, + // then we need to consider storing both types somewhere... + // + if (const ArrayType *AT = ArgTy->getAsArrayType()) + ArgTy = Context.getPointerType(AT->getElementType()); + else if (ArgTy->isFunctionType()) + ArgTy = Context.getPointerType(ArgTy); // Look for 'void'. void is allowed only as a single argument to a // function with no other parameters (C99 6.7.5.3p10). We record // int(void) as a FunctionTypeProto with an empty argument list. - if (ArgTy->isVoidType()) { + else if (ArgTy->isVoidType()) { // If this is something like 'float(int, void)', reject it. 'void' // is an incomplete type (C99 6.2.5p19) and function decls cannot // have arguments of incomplete type.