<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"\@SimSun";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.apple-tab-span
{mso-style-name:apple-tab-span;}
span.EmailStyle18
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Richard,
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thank you for the feedback! I’ll rework the patch based on your feedback. Minor comments inline.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Michael<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> metafoo@gmail.com [mailto:metafoo@gmail.com]
<b>On Behalf Of </b>Richard Smith<br>
<b>Sent:</b> Monday, October 01, 2012 6:16 PM<br>
<b>To:</b> Michael Han<br>
<b>Cc:</b> cfe-dev@cs.uiuc.edu<br>
<b>Subject:</b> Re: [cfe-dev] c++ 11 attribute support in clang<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">On Mon, Oct 1, 2012 at 3:56 PM, Michael Han <<a href="mailto:Michael.Han@autodesk.com" target="_blank">Michael.Han@autodesk.com</a>> wrote:<o:p></o:p></p>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Hi,<br>
<br>
Attached patch is trying to improve the C++ 11 generalized attributes support in Clang:<br>
<br>
- Parse generic C++ 11 attributes into AST instead of parsing and ignoring them.<br>
- Parse attributes arguments if the attributes are in gnu scope.<br>
- Update several tests since with the unknown attributes introduced to AST some expected diagnostics shall be emitted.<br>
<br>
This would allow one to extend Clang attributes using C++ 11 attribute syntax and migrate existing GNU style attributes with new syntax.<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">We had been deliberately holding back on that, waiting for the GCC guys to commit to a particular approach. It looks like they're just putting all their existing attributes into a gnu:: namespace, though, so this is fine:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53528">http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53528</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="http://gcc.gnu.org/ml/gcc-patches/2012-07/msg01348.html">http://gcc.gnu.org/ml/gcc-patches/2012-07/msg01348.html</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">[hanm] Good to know!
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Are there any ideas and plans on adding generalized C++ 11 attribute support to Clang? I feel migrating existing GNU attributes to new syntax might be a good start. Any feedback are appreciated.<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">C++11 attributes certainly need more love, and such work would be very much appreciated. In terms of the standard C++11 pieces, we have a few deficiencies: We don't accept attributes (and alignas) in quite the right set of places, nor do
we apply them to the right set of entities, we get the semantics of [[noreturn]] wrong (we use the GNU __attribute__((noreturn)) semantics, which don't quite match), and we don't issue an error for an attribute which is applied to an entity to which it can't
appertain.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">[hanm] I’ll take a look at these after this patch. Thanks for the pointers!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal">On to your patch:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">+++ lib/Parse/ParseDeclCXX.cpp<span class="apple-tab-span">
</span>(working copy)<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">@@ -2963,46 +2963,35 @@<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">+ if (ScopeName && ScopeName->getName() == "gnu") {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ ParseCXX11AttributeGNUStyleArgs(AttrName, AttrLoc, ScopeName,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ ScopeLoc, attrs);<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Please add some tests for this.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">[hanm] will do.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal">+ // FIXME: handle other formats of c++11 attribute arguments<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">+ ConsumeParen();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ SkipUntil(tok::r_paren, false);<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">It looks like this silently drops unknown attributes followed by parens. Can we add them to the list in this case, so we'll get a warning?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">[hanm] sounds good.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal">[...]<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">+ if (StandardAttr)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> Diag(Tok, diag::err_cxx11_attribute_forbids_ellipsis)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> << AttrName->getName();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">Please reject ellipses for GNU attributes too, for now (with an 'unsupported' error), rather than silently dropping them.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">[hanm] ok.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal">@@ -3014,6 +3003,75 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> SkipUntil(tok::r_square, false);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+bool Parser::IsBuiltInOrStandardCXX11Attribute(IdentifierInfo *AttrName,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ IdentifierInfo *ScopeName) {<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Make this a static, non-member function.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">[hanm] ok.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal">+void Parser::ParseCXX11AttributeGNUStyleArgs(IdentifierInfo *AttrName,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ SourceLocation AttrNameLoc,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ IdentifierInfo *ScopeName,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ SourceLocation ScopeLoc,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ ParsedAttributes &Attrs) {<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Can you share this code between C++11 and GNU attribute parsing?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#1F497D">[hanm] ok.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal">+++ test/Parser/cxx11-stmt-attributes.cpp<span class="apple-tab-span">
</span>(working copy)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">@@ -2,53 +2,55 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> void foo(int i) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+ [[unknown_attribute]] ; // expected-warning {{attribute unknown_attribute cannot be specified on a statement}}<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Yuck. Would you be interested in teaching this warning the difference between 'attribute cannot be specified on a statement' and 'unknown attribute'?<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">[hanm] I’ll improve the diagnostic.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
</div>
</div>
</body>
</html>