On Dec 2, 2007, at 3:57 PM, James Widman wrote:
> On Dec 2, 2007, at 1:42 PM, Chris Lattner wrote:
>> There is also the
>> strangeness in C++ where you have:
>>
>>
>> struct stat { .. };
>> struct stat stat();
>>
>> "stat" is a function, but "struct stat" is the type,
>
> Yep, according to 3.4.4 basic.lookup.elab.
>
>> even though the
>> tag namespace is normally searched for normal identifiers.
>
> Note, in ISO C++ there is no concept of "tag names", "ordinary names",
> "tag name space" or "ordinary name space" as in ISO C.Right. This is part of the fun of handling C and C++ in a unified parser and representation: merging the two concepts together and making them self consistent. C++ does have a separate namespace for labels though still. > In the pre-Standard days, C++ did not even allow the struct stat case, > but eventually the following rule from 3.3.7 basic.scope.hiding was > added (because losing compatibility with POSIX (and probably other > libraries) would have been a deal-breaker): > > A class name (9.1) or enumeration name (7.2) can be > hidden by the name of an object, function, or enumerator > declared in the same scope. If a class or enumeration > name and an object, function, or enumerator are declared > in the same scope (in any order) with the same name, the > class or enumeration name is hidden wherever the object, > function, or enumerator name is visible. Implementing this should be fairly straight-forward I think. Basically, when doing a scope lookup in C++ mode, it should search for anything with "IDNS_Tag or IDNS_Ordinary". If after "struct", just search the IDNS_Tag namespace. The end effect would be that C++ would see tag+ordinary as a unified namespace in most cases. -Chris _______________________________________________ cfe-dev mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
