hokein added a comment.

In D130511#3677423 <https://reviews.llvm.org/D130511#3677423>, @sammccall wrote:

> My main concern here is that this might reject valid code (and if it doesn't, 
> it's not obvious why).
> It does look like C++ forbids the cases I can come up with (e.g. trying to 
> provide a definition for `::Foo` is rejected by clang with "definition or 
> redeclaration of Foo cannot name the global scope).
> But I'd be way more comfortable if we could connect the specific guard rules 
> here with spec language.

The qualified declarator is tricky (it was forbidden until 
https://cplusplus.github.io/CWG/issues/482.html).

The closest thing I can find in the standard is basic.lookup.qual.general 
<https://eel.is/c++draft/basic.lookup.qual.general>:

> If a name, template-id, or decltype-specifier is followed by a ​::​, it shall 
> designate a namespace, class, enumeration, or dependent type, and the ​::​ is 
> never interpreted as a complete nested-name-specifier.

IIUC, this rule forbids the parses `X::Y ::Z;` and `X ::Y::Z;` (because in the 
declarator we have a complete `::` nested-name-specifier).

> If we can't do this rigorously and merely are trying to encourage the 
> *common* parse, then we should do it in soft disambig.
>
> I'd like to think about this some more, do you know what part of the spec 
> says that `x ::y` is invalid if x is e.g. a typedef for `int`?

I didn't try to find it harder, I guess it is probably in the 
qualified-name-look-up section.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D130511/new/

https://reviews.llvm.org/D130511

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to