Skip to content

CWG2917 [temp.pre] Disallow multiple friend-type-specifiers if the friend-declaration is part of a template-declaration #586

Description

@Sirraide

Full name of submitter (unless configured in github; will be published with the issue): Ambrose T

Reference (section label): [temp.pre]

Issue description:

I ran into the following case while implementing variadic friends in Clang. Consider

template <typename>
friend class Foo, int;

This is obviously nonsense, but the grammar currently seems to allow it. A friend-type-declaration ([class.mem.general]) is defined as

friend-type-declaration:
  friend friend-type-specifier-list ;
friend-type-specifier-list:
  friend-type-specifier ...[opt]
  friend-type-specifier-list , friend-type-specifier ...[opt]
friend-type-specifier:
  simple-type-specifier
  elaborated-type-specifier
  typename-specifier

In p3 of that same section, we find

A member-declaration does not declare new members of the class if it is
(3.1) a friend declaration ([class.friend]), [...]
(3.3) a template-declaration whose declaration is one of the above,

which tells us that a template-declaration whose declaration is a friend-type-declaration is valid, but that doesn’t exclude the case I listed above. [temp.pre] disallows this for declarators (p5):

In a template-declaration, explicit specialization, or explicit instantiation, the init-declarator-list in the declaration shall contain at most one declarator.

But the case above, while a template-declaration, doesn’t even have declarators. It seems this case needs to be disallowed separately, but I can’t seem to find any section that would do that.

Suggested resolution:

In [temp.pre], add this to p5 (or as a separate paragraph after that; I’m not sure which would be better):

In a template-declaration whose declaration is a friend-type-declaration, the friend-type-specifier-list shall contain exactly one friend-type-specifier.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions