www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - UDAs grammar: <template_instance> valid?

reply Bruno Medeiros <bruno.do.medeiros+dng gmail.com> writes:
Someone opened an issue report for a bug in the DDT parser, it doesn't 
parse this:

template X(int Y){}

 X!3  // error here
void main(){}

And yet DMD accepts this code. Is this grammar supposed to be valid 
though? The grammar spec doesn't allow it, not that means much. I 
searched for an open grammar bug, but couldn't find one.


-- 
Bruno Medeiros
https://twitter.com/brunodomedeiros
Oct 29 2014
parent reply Kenji Hara via Digitalmars-d <digitalmars-d puremagic.com> writes:
2014-10-29 21:33 GMT+09:00 Bruno Medeiros via Digitalmars-d <
digitalmars-d puremagic.com>:

 Someone opened an issue report for a bug in the DDT parser, it doesn't
 parse this:

 template X(int Y){}

  X!3  // error here
 void main(){}

 And yet DMD accepts this code. Is this grammar supposed to be valid
 though? The grammar spec doesn't allow it, not that means much. I searched
 for an open grammar bug, but couldn't find one.
It is a grammar bug, because DMD parser intentionally accepts the syntax. https://github.com/D-Programming-Language/dmd/blob/9d1d0245fda3107f01d2b1460c7bcc34188a751e/src/parse.c#L1003 StorageClass Parser::parseAttribute(Expressions **pudas) { nextToken(); Expressions *udas = NULL; StorageClass stc = 0; if (token.value == TOKidentifier) { if (token.ident == Id::property) ... else { // Allow identifier, template instantiation, or function call <----- Expression *exp = parsePrimaryExp(); if (token.value == TOKlparen) { Loc loc = token.loc; exp = new CallExp(loc, exp, parseArguments()); } udas = new Expressions(); udas->push(exp); } } Kenji Hara
Oct 29 2014
parent Bruno Medeiros <bruno.do.medeiros+dng gmail.com> writes:
On 29/10/2014 13:21, Kenji Hara via Digitalmars-d wrote:
 2014-10-29 21:33 GMT+09:00 Bruno Medeiros via Digitalmars-d
 <digitalmars-d puremagic.com <mailto:digitalmars-d puremagic.com>>:

     Someone opened an issue report for a bug in the DDT parser, it
     doesn't parse this:

     template X(int Y){}

      X!3  // error here
     void main(){}

     And yet DMD accepts this code. Is this grammar supposed to be valid
     though? The grammar spec doesn't allow it, not that means much. I
     searched for an open grammar bug, but couldn't find one.


 It is a grammar bug, because DMD parser intentionally accepts the syntax.
Opened: https://issues.dlang.org/show_bug.cgi?id=13664 -- Bruno Medeiros https://twitter.com/brunodomedeiros
Oct 29 2014