[cfe-dev] Bug in clang parsing pointer to an array in function parameter list

Justin Handville uniheliodem at gmail.com
Sat Sep 8 21:39:13 PDT 2007


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