Skip to content

Commit

Permalink
[clang] Add test for CWG1820 "Qualified typedef names" (llvm#91765)
Browse files Browse the repository at this point in the history
[P1787R6](https://wg21.link/p1787r6):
> [CWG1820](https://cplusplus.github.io/CWG/issues/1820.html) is
resolved by requiring that a qualified declarator-id declare an entity.

P1787R6 changes wording of [dcl.pre]/9. Quote from the current draft
([[dcl.pre]/5](https://eel.is/c++draft/dcl.pre#5)):
> If a
[declarator-id](https://eel.is/c++draft/dcl.decl.general#nt:declarator-id)
is a name, the
[init-declarator](https://eel.is/c++draft/dcl.decl.general#nt:init-declarator)
and (hence) the declaration introduce that
name[.](https://eel.is/c++draft/dcl.pre#5.sentence-1)
> [Note [3](https://eel.is/c++draft/dcl.pre#note-3): Otherwise, the
[declarator-id](https://eel.is/c++draft/dcl.decl.general#nt:declarator-id)
is a
[qualified-id](https://eel.is/c++draft/expr.prim.id.qual#nt:qualified-id)
or names a destructor or its
[unqualified-id](https://eel.is/c++draft/expr.prim.id.unqual#nt:unqualified-id)
is a [template-id](https://eel.is/c++draft/temp.names#nt:template-id)
and no name is
introduced[.](https://eel.is/c++draft/dcl.pre#5.sentence-2)
— end note]
  • Loading branch information
Endilll committed May 11, 2024
1 parent 5cd2804 commit 1351aab
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
47 changes: 47 additions & 0 deletions clang/test/CXX/drs/cwg18xx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,53 @@ namespace cwg1815 { // cwg1815: no
#endif
}

namespace cwg1820 { // cwg1820: 3.5
typedef int A;
typedef int cwg1820::A;
// expected-warning@-1 {{extra qualification on member 'A'}}
// expected-error@-2 {{typedef declarator cannot be qualified}}

namespace B {
typedef int cwg1820::A;
// expected-error@-1 {{cannot define or redeclare 'A' here because namespace 'B' does not enclose namespace 'cwg1820'}}
// expected-error@-2 {{typedef declarator cannot be qualified}}
}

class C1 {
typedef int cwg1820::A;
// expected-error@-1 {{non-friend class member 'A' cannot have a qualified name}}
// expected-error@-2 {{typedef declarator cannot be qualified}}
};

template <typename>
class C2 {
typedef int cwg1820::A;
// expected-error@-1 {{non-friend class member 'A' cannot have a qualified name}}
// expected-error@-2 {{typedef declarator cannot be qualified}}
};

void d1() {
typedef int cwg1820::A;
// expected-error@-1 {{definition or redeclaration of 'A' not allowed inside a function}}
// expected-error@-2 {{typedef declarator cannot be qualified}}
}

template<typename>
void d2() {
typedef int cwg1820::A;
// expected-error@-1 {{definition or redeclaration of 'A' not allowed inside a function}}
// expected-error@-2 {{typedef declarator cannot be qualified}}
}

#if __cplusplus >= 201103L
auto e = [] {
typedef int cwg1820::A;
// expected-error@-1 {{definition or redeclaration of 'A' not allowed inside a function}}
// expected-error@-2 {{typedef declarator cannot be qualified}}
};
#endif
} // namespace cwg1820

namespace cwg1821 { // cwg1821: 2.9
struct A {
template <typename> struct B {
Expand Down
2 changes: 1 addition & 1 deletion clang/www/cxx_dr_status.html
Original file line number Diff line number Diff line change
Expand Up @@ -10728,7 +10728,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/1820.html">1820</a></td>
<td>CD6</td>
<td>Qualified typedef names</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1821">
<td><a href="https://cplusplus.github.io/CWG/issues/1821.html">1821</a></td>
Expand Down

0 comments on commit 1351aab

Please sign in to comment.