r259624 - Make CF constant string decl visible to name lookup to fix module errors

Douglas Gregor via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 3 11:45:15 PST 2016


> On Feb 2, 2016, at 7:26 PM, Ben Langmuir via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: benlangmuir
> Date: Tue Feb  2 21:26:19 2016
> New Revision: 259624
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=259624&view=rev
> Log:
> Make CF constant string decl visible to name lookup to fix module errors
> 
> The return type of the __builtin___*StringMakeConstantString functions
> is a pointer to a struct, so we need that struct to be visible to name
> lookup so that we will correctly merge multiple declarations of that
> type if they come from different modules.
> 
> Incidentally, to make this visible to name lookup we need to rename the
> type to __NSConstantString, since the real NSConstantString is an
> Objective-C interface type.  This shouldn't affect anyone outside the
> compiler since users of the constant string builtins cast the result
> immediately to CFStringRef.
> 
> Since this struct type is otherwise implicitly created by the AST
> context and cannot access namelookup, we make this a predefined type
> and initialize it in Sema.
> 
> Note: this issue of builtins that refer to types not visible to name
> lookup technically also affects other builtins (e.g. objc_msgSendSuper),
> but in all other cases the builtin is a library builtin and the issue
> goes away if you include the library that defines the types it uses,
> unlike for these constant string builtins.
> 
> rdar://problem/24425801

Two comments below…

> [snip]
> 
> Modified: cfe/trunk/lib/Sema/Sema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=259624&r1=259623&r2=259624&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.cpp (original)
> +++ cfe/trunk/lib/Sema/Sema.cpp Tue Feb  2 21:26:19 2016
> @@ -189,6 +189,10 @@ void Sema::Initialize() {
>     DeclarationName Protocol = &Context.Idents.get("Protocol");
>     if (IdResolver.begin(Protocol) == IdResolver.end())
>       PushOnScopeChains(Context.getObjCProtocolDecl(), TUScope);
> +
> +    DeclarationName ConstantString = &Context.Idents.get("NSConstantString");
> +    if (IdResolver.begin(ConstantString) == IdResolver.end())
> +      PushOnScopeChains(Context.getCFConstantStringDecl(), TUScope);

Shouldn’t this be looking for __NSConstantString?

Also, isn’t CFSTR available even in C? This code path is Objective-C-only...

	- Doug




More information about the cfe-commits mailing list