[cfe-dev] Help with parsing C++ member-declarator
    Jan Korous via cfe-dev 
    cfe-dev at lists.llvm.org
       
    Wed Feb  7 07:17:44 PST 2018
    
    
  
Hi all,
I would like to ask for help with Parser. My goal is to detect grammatically invalid order of *override* and *noexcept* keywords in parser and suggest a fixit.
C++ grammar of member-declarator allows virt-specifier-seq (e. g. override) only after declarator (which contains exception-specification - e. g. noexcept).
For this code:
struct Base { virtual void foo(); };
struct Derived : Base { virtual void foo() override noexcept; };
we currently display this error:
exp.cpp:2:52: error: expected ';' at end of declaration list
from which the issue is not really obvious.
Current implementation works like this.
The starting point is ParseCXXMemberDeclaratorBeforeInitializer() which calls (in this order):
1. ParseFunctionDeclarator() which parses all of these
    cv-qualifier-seq,
    ref-qualifier,
    exception-specification,
    attribute-specifier-seq,
    exception-specification,
    dynamic-exception-specification,
    noexcept-specification
2. ParseOptionalCXX11VirtSpecifierSeq() which parses
    virt-specifier-seq
The call graph looks like this:
ParseCXXMemberDeclaratorBeforeInitializer()
    ParseDeclarator()
        ParseDeclaratorInternal( &ParseDirectDeclarator ) // pointer to method as an argument
            ParseDirectDeclarator()
                ParseFunctionDeclarator()
ParseCXXMemberDeclaratorBeforeInitializer()
    ParseOptionalCXX11VirtSpecifierSeq()
There's also this related FIXME:
ParseDecl.cpp:6028
      // FIXME: Accept these components in any order, and produce fixits to
      // correct the order if the user gets it wrong. Ideally we should deal
      // with the pure-specifier in the same way.
What do you guys recommend as the best approach here? I would expect some refactoring of relevant methods and then just a small if block detecting the wrong order of keywords, outputting diagnostics and fixit and swapping those tokens. I am still just getting familiar with the codebase and would appreciate some guidance.
Thank you.
Best,
Jan
    
    
More information about the cfe-dev
mailing list