<div dir="ltr">On Wed, Jun 19, 2013 at 2:53 AM, Adler, Arik <span dir="ltr"><<a href="mailto:arik.adler@intel.com" target="_blank">arik.adler@intel.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal" style="text-align:left;direction:ltr"><u></u> <u></u></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d">I am now testing blocks usage in OpenCL.<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d">I noticed that Clang forbids using an arrays within blocks (Clang forbid array capturing)<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d">For Example, the following code will fail to compile because there is a reference to an array within a block.<u></u><u></u></span></p>

<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d">But if the line referring to block will comment out and the line with reference to integer pointer ('j') will comment in, the code will pass.<u></u><u></u></span></p>

<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:9.5pt;font-family:Consolas"> block_arr()<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">{<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">  <span style="color:blue">int</span> res = 0;<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">  <span style="color:blue">int</span> i[4] = { 3, 4, 4, 1 };<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">  <span style="color:blue">int</span>* j = i;<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">  <u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">  <span style="color:blue">int</span> (^test_block )(<span style="color:blue">int</span>) = ^(<span style="color:blue">int</span> num)<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">    {<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">      <span style="color:blue">
return</span> num + i[1];      <span style="color:green">// This is an error: "error: cannot refer to declaration with an array type inside block"</span><u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas;color:green">//      return num + j[1];    // This would work</span><span style="font-size:9.5pt;font-family:Consolas"><u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">    };<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas"><u></u> <u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">    res = test_block(7);<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:1.0in;text-align:left;text-autospace:none;direction:ltr">
<span style="font-size:9.5pt;font-family:Consolas">}<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><u></u> <u></u></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d">Do you know what is the reason behind this limitation?<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d">And why it is possible to use a regular pointers but arrays are forbidden?<u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr"><span style="color:#1f497d"><u></u> </span></p></div></div></blockquote><div><br></div><div>IIRC, it's just so that people don't accidentally make implicit copies of large arrays.</div>
<div><br></div><div>-Eli </div></div></div></div>