[cfe-dev] Bug in clang parsing pointer to an array in function parameter list
Justin Handville
uniheliodem at gmail.com
Sat Sep 8 21:43:37 PDT 2007
Perhaps the better question to ask is where should this transform occur?
On 9/9/07, Justin Handville <uniheliodem at gmail.com> wrote:
> The following code snippet generates an assert when compiled with
> clang -emit-llvm
>
> int main(int argc, char* argv[])
> {
> return 0;
> }
>
> Assert:
>
> Assertion failed: (getOperand(0)->getType() ==
> cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr
> must be a pointer to Val type!"), function AssertOK, file
> Instructions.cpp, line 796.
>
> The problem here is at line 116 of CGDecl.cpp:
>
> if (LTy->isFirstClassType()) {
> // TODO: Alignment
> DeclPtr = new llvm::AllocaInst(LTy, 0, std::string(D.getName())+".addr",
> AllocaInsertPt);
>
> // Store the initial value into the alloca.
> Builder.CreateStore(Arg, DeclPtr); //attempting to store
> char*[] as char**
>
> The problem is that llvm treats char*[] and char** as two distinct
> types as far as I can tell. EmitParmDecl should convert the type to a
> char** before calling CreateStore, since this is how the argument
> would be passed in C ABI.
>
> I assume that a transform step should be added before the CreateStore
> that could normalize the argument to match the declptr. I assume a
> good approach would be to descend through both Arg and DeclPtr,
> transforming Arg to match DeclPtr where compatible, or raising an
> appropriate diagnostic error if such a transformation is not possible.
>
> If I can get some approval that this route would work in this case,
> then I will go ahead and submit the patch.
>
> Thanks,
> Justin
>
More information about the cfe-dev
mailing list