<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>