r224504 - Fix for PR21915: assert on multidimensional VLA in function arguments.

David Majnemer david.majnemer at gmail.com
Thu Dec 18 17:54:32 PST 2014


On Wed, Dec 17, 2014 at 10:54 PM, Alexey Bataev <a.bataev at hotmail.com>
wrote:
>
> Author: abataev
> Date: Thu Dec 18 00:54:53 2014
> New Revision: 224504
>
> URL: http://llvm.org/viewvc/llvm-project?rev=224504&view=rev
> Log:
> Fix for PR21915: assert on multidimensional VLA in function arguments.
> Fixed assertion on type checking for arguments and parameters on function
> call if arguments are pointers to VLA
> Differential Revision: http://reviews.llvm.org/D6655
>
> Added:
>     cfe/trunk/test/CodeGen/vlt_to_pointer.c   (with props)
>     cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp   (with props)
> Modified:
>     cfe/trunk/lib/CodeGen/CodeGenFunction.h
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=224504&r1=224503&r2=224504&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Thu Dec 18 00:54:53 2014
> @@ -2746,28 +2746,13 @@ public:
>                  E = CallArgTypeInfo->param_type_end();
>             I != E; ++I, ++Arg) {
>          assert(Arg != ArgEnd && "Running over edge of argument list!");
> -#ifndef NDEBUG
> -        QualType ArgType = *I;
> -        QualType ActualArgType = Arg->getType();
> -        if (ArgType->isPointerType() && ActualArgType->isPointerType()) {
> -          QualType ActualBaseType =
> -              ActualArgType->getAs<PointerType>()->getPointeeType();
> -          QualType ArgBaseType =
> -              ArgType->getAs<PointerType>()->getPointeeType();
> -          if (ArgBaseType->isVariableArrayType()) {
> -            if (const VariableArrayType *VAT =
> -                    getContext().getAsVariableArrayType(ActualBaseType)) {
> -              if (!VAT->getSizeExpr())
> -                ActualArgType = ArgType;
> -            }
> -          }
> -        }
> -        assert(getContext()
> -                       .getCanonicalType(ArgType.getNonReferenceType())
> -                       .getTypePtr() ==
> -
>  getContext().getCanonicalType(ActualArgType).getTypePtr() &&
> -               "type mismatch in call argument!");
> -#endif
> +        assert(
> +            ((*I)->isVariablyModifiedType() ||
> +             getContext()
> +                     .getCanonicalType((*I).getNonReferenceType())
> +                     .getTypePtr() ==
> +
>  getContext().getCanonicalType(Arg->getType()).getTypePtr()) &&
> +            "type mismatch in call argument!");
>          ArgTypes.push_back(*I);
>        }
>      }
>
> Added: cfe/trunk/test/CodeGen/vlt_to_pointer.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/vlt_to_pointer.c?rev=224504&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/vlt_to_pointer.c (added)
> +++ cfe/trunk/test/CodeGen/vlt_to_pointer.c Thu Dec 18 00:54:53 2014
> @@ -0,0 +1,30 @@
> +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
> +
> +int c[1][3*2];
> +// CHECK: @{{.+}} = {{.*}} global [1 x [6 x {{i[0-9]+}}]] zeroinitializer
> +
> +// CHECK-LABEL: @f
> +int f(int * const m, int (**v)[*m * 2])
> +{
> +    return &(c[0][*m]) == &((*v)[0][*m]);
> +    // CHECK: icmp
> +    // CHECK: ret i{{[0-9]+}}
> +}
> +
> +// CHECK-LABEL: @test
> +int test(int n, int (*(*fn)(void))[n]) {
> +  return (*fn())[0];
> +}
> +
> +// CHECK-LABEL: @main
> +int main()
> +{
> +    int m = 3;
> +    int (*d)[3*2] = c;
> +    int (*fn[m])(void);
> +    return f(&m, &d) + test(m, &fn);
> +
> +    // CHECK: call {{.+}} @f(
> +    // CHECK: ret i{{[0-9]+}}
> +}
> +
>
> Propchange: cfe/trunk/test/CodeGen/vlt_to_pointer.c
>
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: cfe/trunk/test/CodeGen/vlt_to_pointer.c
>
> ------------------------------------------------------------------------------
>     svn:keywords = Author Date Id Rev URL
>
> Propchange: cfe/trunk/test/CodeGen/vlt_to_pointer.c
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>

Why do we have SVN properties on these tests?


>
> Added: cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp?rev=224504&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp Thu Dec 18 00:54:53 2014
> @@ -0,0 +1,22 @@
> +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
> +
> +// CHECK-LABEL: @main
> +
> +struct dyn_array {
> +    int size;
> +    int data[];
> +};
> +
> +int foo(dyn_array **&d) {
> +  return (*d)->data[1];
> +}
> +
> +int main()
> +{
> +    dyn_array **d;
> +    return foo(d);
> +
> +    // CHECK: call {{.+}} @{{.+}}foo{{.+}}(
> +    // CHECK: ret i{{[0-9]+}}
> +}
> +
>
> Propchange: cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp
>
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp
>
> ------------------------------------------------------------------------------
>     svn:keywords = Author Date Id Rev URL
>
> Propchange: cfe/trunk/test/CodeGenCXX/vlt_to_reference.cpp
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141218/e3b2d6f8/attachment.html>


More information about the cfe-commits mailing list