[PATCH] D34263: [preprocessor] When preprocessor option 'SingleFileParseMode' is enabled, parse all directive blocks if the condition uses undefined macros
Argyrios Kyrtzidis via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 19 09:39:18 PDT 2017
akyrtzi added a comment.
In https://reviews.llvm.org/D34263#783770, @voskresensky.vladimir wrote:
> What I find problematic in this patch is PPOpts->SingleFileParseMode checks.
> Let's suppose we implement what I mentioned above => how is it going to co-exist nicely? I think code will be less understandable with both: check of flag and call to PPCallbacks.
> What I propose is to move the logic from the PPOpts single flag into PPCallbacks. And from check of flag to query of PPCallbacks.
> Of course when you create PPCallbacks you can consult global SingleFileParseMode to create default implementation to answer "any symbol is defined", so you get your use-case easily handled, but it also gives others more flexibility.
There is a bit of misunderstanding on what this patch is doing, the patch is not about answering "any symbol is defined". See my cfe-dev email (http://lists.llvm.org/pipermail/cfe-dev/2017-June/054254.html) that provides some more context.
The patch is doing these 2 things:
- Keep track of whether a preprocessor directive condition used a symbol that was not resolved at all
- If above is true then make the preprocessor parse all directive blocks, not arbitrary choose one of them.
Here's an example to clarify the difference:
Say that you have this code:
@interface A @end
@interface B @end
1. Without any changes this will happen:
- TARGET_IOS is unresolved so it will be treated as `0`
- `#if` block will be skipped, `#else` will be parsed
- AST will contain `@interface B`
2. With adding a PPCallback that answers "any symbol is defined" (what you are proposing):
- TARGET_IOS is undefined but the PPCallback sets it to `1`
- `#if` block will be parsed, `#else` will be skipped
- AST will contain `@interface A`
3. With this patch and enabling `SingleFileParseMode`
- TARGET_IOS is unresolved
- Both `#if` and `#else` blocks will be parsed
- AST will contain both `@interface A` and `@interface B`
As you can see 2. and 3. above are not overlapping so they can "co-exist nicely" like this:
- TARGET_IOS is undefined, ask the PPCallback if it has a value for it or not
- If the callback provides a value then parse as 1. or 2. depending on the value
- If the callback cannot provide a specific value then parse as 3.
More information about the cfe-commits