[PATCH] Start to unify contextual keywords

Alp Toker alp at nuanti.com
Fri Dec 13 06:02:13 PST 2013


On 12/12/2013 20:47, Richard Smith wrote:
> I like the simplification here.
>
> +  if (TagType == DeclSpec::TST_struct && Tok.isNot(tok::identifier)) {
> +    const IdentifierInfo *II = Tok.getIdentifierInfo();
>
> This will assert if there's an annotation token here (that might 
> happen if we've done some tentative parsing and annotated a nested 
> name specifier).

Good catch. I'll shore it up.

>
>
> The reverting-and-unreverting mechanism here seems unsatisfying. 
> Perhaps we should redesign this somewhat. How about changing the 
> semantics to be simply that these tokens are always normal 
> identifiers, except when they're followed by a left paren (in the case 
> where your patch calls TryIdentKeywordUpgrade).
>
> Specifically, something like: change the RevertedTokenID flag on Token 
> to a ContextualKeyword flag or similar, set the kind to 
> tok::identifier by default for these traits, and generate a 
> StringSwitch in TryIdentKeywordUpgrade to pick the right kind. Then we 
> can drop the TryKeywordIdentFallback hack entirely -- the semantics 
> would be simply that these identifiers are normal identifiers unless 
> they're followed by a left paren.

Agree that it's unsatisfying. I've encapsulated the behaviour into these 
two functions exactly so we can experiment with techniques like that.

The approach you describe makes sense for many of the contextual 
keywords, but for type traits specifically I suspect it may make sense 
to tidy and refine the current approach. If we end up making these names 
globally available as identifiers, user code is going to start using 
them and that's going to become a portability headaches. So it could go 
either way but I'd like to investigate that on a separate schedule, 
tending towards "less magic" for now.

Either solution should help put an end to the cat-and-mouse game between 
libc++, libstdc++, MSVC and Embarcadero fighting over the __is_ and 
__has_ namespace.

Let's revisit this once I've unified the other kinds of 
context-sensitive keywords so we can compare the merits of each approach.

Alp.





>
>
> On Thu, Dec 12, 2013 at 6:46 AM, Alp Toker <alp at nuanti.com 
> <mailto:alp at nuanti.com>> wrote:
>
>     Hi,
>
>     Now that we emit diagnostics for keyword-as-identifier hacks
>     (-Wkeyword-compat) we can go ahead and simplify some of the old
>     revertible keyword support.
>
>     This patch adds a TryIdentKeywordUpgrade() function to mirror the
>     recently added TryKeywordIdentFallback(), and uses it to replace
>     hard-coded REVERTIBLE_TYPE_TRAITs.
>
>     The mid-term goal is to work with libc++ to remove dependence on
>     the GNU token hacks, and to unify context-sensitive keyword
>     handing in the C++ frontend.
>
>      4 files changed, 43 insertions(+), 70 deletions(-)
>
>     Alp.
>
>     -- 
>     http://www.nuanti.com
>     the browser experts
>
>
>     _______________________________________________
>     cfe-commits mailing list
>     cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
>     http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>

-- 
http://www.nuanti.com
the browser experts




More information about the cfe-commits mailing list