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