xref: /aosp_15_r20/external/clang/test/Parser/cxx-using-declaration.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace A {
4*67e74705SXin Li     int VA;
FA()5*67e74705SXin Li     void FA() {}
6*67e74705SXin Li     struct SA { int V; };
7*67e74705SXin Li }
8*67e74705SXin Li 
9*67e74705SXin Li using A::VA;
10*67e74705SXin Li using A::FA;
11*67e74705SXin Li using typename A::SA;
12*67e74705SXin Li 
main()13*67e74705SXin Li int main()
14*67e74705SXin Li {
15*67e74705SXin Li     VA = 1;
16*67e74705SXin Li     FA();
17*67e74705SXin Li     SA x;   //Still needs handling.
18*67e74705SXin Li }
19*67e74705SXin Li 
20*67e74705SXin Li struct B {
fB21*67e74705SXin Li     void f(char){};
gB22*67e74705SXin Li     void g(char){};
23*67e74705SXin Li };
24*67e74705SXin Li struct D : B {
25*67e74705SXin Li     using B::f;
26*67e74705SXin Li     void f(int);
27*67e74705SXin Li     void g(int);
28*67e74705SXin Li };
f(int)29*67e74705SXin Li void D::f(int) { f('c'); } // calls B::f(char)
g(int)30*67e74705SXin Li void D::g(int) { g('c'); } // recursively calls D::g(int)
31*67e74705SXin Li 
32*67e74705SXin Li namespace E {
funcE(TYPE arg)33*67e74705SXin Li     template <typename TYPE> int funcE(TYPE arg) { return(arg); }
34*67e74705SXin Li }
35*67e74705SXin Li 
36*67e74705SXin Li using E::funcE<int>; // expected-error{{using declaration cannot refer to a template specialization}}
37*67e74705SXin Li 
38*67e74705SXin Li namespace F {
39*67e74705SXin Li     struct X;
40*67e74705SXin Li }
41*67e74705SXin Li 
42*67e74705SXin Li using F::X;
43*67e74705SXin Li // Should have some errors here.  Waiting for implementation.
44*67e74705SXin Li void X(int);
45*67e74705SXin Li struct X *x;
46*67e74705SXin Li 
47*67e74705SXin Li 
48*67e74705SXin Li namespace ShadowedTagNotes {
49*67e74705SXin Li 
50*67e74705SXin Li namespace foo {
51*67e74705SXin Li   class Bar {};
52*67e74705SXin Li }
53*67e74705SXin Li 
54*67e74705SXin Li void Bar(int); // expected-note{{class 'Bar' is hidden by a non-type declaration of 'Bar' here}}
55*67e74705SXin Li using foo::Bar;
56*67e74705SXin Li 
ambiguity()57*67e74705SXin Li void ambiguity() {
58*67e74705SXin Li    const Bar *x; // expected-error{{must use 'class' tag to refer to type 'Bar' in this scope}}
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li } // namespace ShadowedTagNotes
62