<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Apr 8, 2009, at 9:46 AM, Douglas Gregor wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Apr 8, 2009, at 7:59 AM, fjahanian wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><br><div><div>On Apr 8, 2009, at 5:02 AM, steve naroff wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><br><div><div>On Apr 7, 2009, at 11:01 PM, Eli Friedman wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>On Tue, Apr 7, 2009 at 7:56 PM, Anders Carlsson <<a href="mailto:andersca@mac.com">andersca@mac.com</a>> wrote:<br><blockquote type="cite">Author: andersca<br></blockquote><blockquote type="cite">Date: Tue Apr  7 21:55:55 2009<br></blockquote><blockquote type="cite">New Revision: 68583<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=68583&view=rev">http://llvm.org/viewvc/llvm-project?rev=68583&view=rev</a><br></blockquote><blockquote type="cite">Log:<br></blockquote><blockquote type="cite">Don't assume that a block always has a FunctionProtoType. Fixes <a href="rdar://6768379">rdar://6768379</a>.<br></blockquote><br>Maybe we should make "int (^a0)()" and "int (^a0)(void)" equivalent?</div></blockquote><div><br></div>I agree with you. IIRC this is what I originally implemented (in clang). I forget what motivated us to support K&R style as a "convenience" (see excerpt below). Fariborz?</div></blockquote><div><br class="khtml-block-placeholder"></div>In gcc,  initially we followed the rules for function pointers for lack of a detailed specification.</div><div>As usage of blocks start getting traction, we tightened the rules as outlined below.</div></div></blockquote><div><br></div><div>Okay, that's this part:</div><div><br></div><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 14px/normal Helvetica; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; "> A Block that takes no arguments must specify void in the argument list [voidarg.c].  An empty parameter list does not represent, as K&R provide, an unspecified argument list.  Note: both gcc and clang support K&R style as a convenience.</div><div><br></div></div></div></blockquote></div></div></blockquote></div></div></div></blockquote></div><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>I don't understand what it means for a feature to be a "convenience". Either blocks support can support K&R-style functions without prototypes or they can't. There's no "legacy" code to worry about, here, so it doesn't make any sense to say, "this is wrong, but these compilers support it."</div><div><br></div><div>Personally, I feel that blocks should always require prototypes. It's a new feature without any legacy code to support, and prototypes are the way forward: the C committee seems to favor prototypes, and of course C++ always uses prototypes.</div></div></div></blockquote><div><br class="webkit-block-placeholder"></div>What is the compelling reason not to allow K&R style definition, other than the trend in c standardization?</div><div>Maybe by convenience (I did not write this), it is meant that people who are use to using function pointers</div><div>can adapt blocks more quickly if K&R style is allowed.</div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><br></div><div>For Clang, we should either warn about or reject code like: </div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">       </span>int (^a0)() </div><div><br></div><div>in C, treat it as int (^a0)(void), and provide a fix-it hint suggesting the introduction of "void". </div><div><br></div><div>In C++, it already means the same thing as int (^a0)(void), so there's nothing to do.</div></div></div></blockquote><div><br class="webkit-block-placeholder"></div>Blocks in c++ mode in gcc follow this rule.</div><div><br class="webkit-block-placeholder"></div><div>- Fariborz</div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><br></div><div>If we aren't doing this already, why not?</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>- Doug<br></div></div></div></blockquote></div><br></body></html>