[cfe-dev] CXX11 attribute spelling and LateParsed=1

Richard Smith via cfe-dev cfe-dev at lists.llvm.org
Mon Oct 9 18:47:57 PDT 2017


On 6 October 2017 at 07:36, Javier López Gómez via cfe-dev <
cfe-dev at lists.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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171009/09ef8249/attachment.html>


More information about the cfe-dev mailing list