[cfe-dev] CXX11 attribute spelling and LateParsed=1
Javier López via cfe-dev
cfe-dev at lists.llvm.org
Thu Dec 21 04:41:31 PST 2017
I have an update on this, but I forgot to post it here.
The fix turned out to be simple. Given that the attribute subject in the
Attr.td file is
let Subjects = SubjectsList<[Function]>
The only thing to do is to move the type attribute to the attribute list of
the declarator. That is accomplished by the following lines:
In lib/Sema/SemaType.cpp, function processTypeAttrs():
case AttributeList::AT_TheAttribute:
moveAttrFromListToList(attr, state.getCurrentAttrListRef(),
state.getDeclarator().getAttrListRef());
break;
Regards.
El vie, 20-10-2017 a las 13:25 +0200, Javier López escribió:
> El mar, 10-10-2017 a las 22:48 -0600, Eric Fiselier escribió:
> >
> > On Mon, Oct 9, 2017 at 7:47 PM, Richard Smith via cfe-dev <cfe-dev at lists.l
> > lvm.org> wrote:
> > > On 6 October 2017 at 07:36, Javier López Gómez via cfe-dev <cfe-dev at list
> > > s.llvm.org> wrote:
> > > > Hi,
> > > >
> > > > I'm new to Clang hacking. Recently -prior to addition of a new
> > > > attribute-, I tried adding a C++11 spelling of the DiagnoseIf
> > > > attribute in the file
> > > > `tools/clang/include/clang/Basic/Attr.td':
> > > >
> > > > let Spellings = [GNU<"diagnose_if">,
> > > > CXX11<"", "diagnose_if", 201603>];
> > > >
> > > > but the parser complains if the expression contains references to
> > > > function arguments, even if `LateParsed = 1' is specified, i.e. this
> > > > works
> > > >
> > > > int foo(int arg) __attribute__((diagnose_if(arg == 0, "text",
> > > > "warning")));
> > > >
> > > > but this will not:
> > > >
> > > > [[diagnose_if(arg == 0, "text", "warning")]] int foo(int arg);
> > > >
> > > >
> > > > Am I missing something? Any help will be much appreciated.
> > >
> > > There is nowhere that a C++11-syntax attribute can be written where it
> > > appertains to the function entity and the function parameter names are
> > > in scope. The two locations where attributes can be applied to a name
> > > introduced by a declarator are:
> > >
> > > [[here]] int f [[and_here]] (int x);
> > >
> > > ... and neither of them follows the "x" parameter's declaration. After
> > > some discussion with Aaron, we think the best way forward is to recast
> > > such attributes as attributes on the function *type* (that perhaps don't
> > > change the canonical type, but do affect how the function declarator is
> > > interpreted as forming a function in some way). That'd mean you'd put
> > > the attributes:
> > >
> > > int f(int x) [[here]];
> > >
> > > ... which conveniently is a place where the function parameters are in
> > > scope. The downside is that we don't have parsing support for attributes
> > > that appertain to function types yet. That would need to be added.
> > >
> >
> > I've been working on a fix for this; But if you want to hack on this, I'm
> > happy to yield.
>
> Yes, I will be working on this for the next days. Thanks.
>
> >
> > > _______________________________________________
> > > cfe-dev mailing list
> > > cfe-dev at lists.llvm.org
> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> > >
>
>
--
Javier López
2.2.B.08 ARCOS lab, Computer Architecture Group
University Carlos III of Madrid
e-mail: jalopezg at inf.uc3m.es
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171221/62d27616/attachment.html>
More information about the cfe-dev
mailing list