xref: /llvm-project/clang/test/CXX/special/class.inhctor/elsewhere.cpp (revision c1f8e493da17d147a59fcc6b66d69d18b56eb00d)
1 // RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
2 
3 // Tests related to constructor inheriting, but not specified in [class.inhctor]
4 
5 // [namespace.udecl]p8:
6 //   A using-declaration for a class member shall be a member-declaration.
7 
8 struct B1 {
9   B1(int);
10 };
11 
12 using B1::B1; // expected-error {{using declaration can not refer to class member}}
13 
14 // C++0x [namespace.udecl]p10:
15 //   A using-declaration is a declaration and can therefore be used repeatedly
16 //   where (and only where) multiple declarations are allowed.
17 
18 struct I1 : B1 {
19   using B1::B1; // expected-note {{previous using declaration}}
20   using B1::B1; // expected-error {{redeclaration of using decl}}
21 };
22 
23 // C++0x [namespace.udecl]p3:
24 //   In a using declaration used as a member-declaration, the nested-name-
25 //   specifier shall name a base class of the class being defined.
26 //   If such a using-declaration names a constructor, the nested-name-specifier
27 //   shall name a direct base class of the class being defined.
28 
29 struct D1 : I1 {
30   using B1::B1; // expected-error {{'B1' is not a direct base of 'D1', can not inherit constructors}}
31 };
32