On Thu, Mar 21, 2019 at 04:19:37PM -0600, Martin Sebor wrote: > > Say that the argument is either a type or an expression that is > > either an identifier (for C++ id-expression) to cover 1) and > > a postfix expression with . or -> operator (to cover COMPONENT_REF)? > > That doesn't look easy to understand.
Why? Those users that don't read corresponding language standards will just see the compiler diagnosing any uses but those 3 kinds and can then just read the documentation which will show in examples what is accepted and what it will do. > > We do not want to allow INDIRECT_REF, ARRAY_REF, etc. > > Why not? What exactly is the concern? Because only the . and -> operators are needed to get at the non-static member declaration. INDIRECT_REF or ARRAY_REF aren't useful for that, and then it raises the question what exactly is supposed to be the behavior when you use *expr or expr[0] or expr->field[0]. Those expression don't have any decl, so we'd be back at your suggestion to pretty randomly sometimes return DECL_ATTRIBUTES, sometimes TYPE_ATTRIBUTES, sometimes both. That is just a bad design. If people want type attributes, they should use __typeof or decltype or just type itself in the argument. Jakub