xref: /llvm-project/clang/test/Parser/cxx-using-declaration.cpp (revision 025f428c7303c6b9e11d2a944fe68becd80b7449)
18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s
2fec52635SDouglas Gregor 
3fec52635SDouglas Gregor namespace A {
4fec52635SDouglas Gregor     int VA;
FA()5fec52635SDouglas Gregor     void FA() {}
6fec52635SDouglas Gregor     struct SA { int V; };
7fec52635SDouglas Gregor }
8fec52635SDouglas Gregor 
9fec52635SDouglas Gregor using A::VA;
10fec52635SDouglas Gregor using A::FA;
11fec52635SDouglas Gregor using typename A::SA;
12fec52635SDouglas Gregor 
main()130bba2b61SDouglas Gregor int main()
14fec52635SDouglas Gregor {
15fec52635SDouglas Gregor     VA = 1;
16fec52635SDouglas Gregor     FA();
17fec52635SDouglas Gregor     SA x;   //Still needs handling.
18fec52635SDouglas Gregor }
19fec52635SDouglas Gregor 
20fec52635SDouglas Gregor struct B {
fB21fec52635SDouglas Gregor     void f(char){};
gB22fec52635SDouglas Gregor     void g(char){};
23fec52635SDouglas Gregor };
24fec52635SDouglas Gregor struct D : B {
25fec52635SDouglas Gregor     using B::f;
26fec52635SDouglas Gregor     void f(int);
27fec52635SDouglas Gregor     void g(int);
28fec52635SDouglas Gregor };
f(int)29fec52635SDouglas Gregor void D::f(int) { f('c'); } // calls B::f(char)
g(int)30fec52635SDouglas Gregor void D::g(int) { g('c'); } // recursively calls D::g(int)
31fec52635SDouglas Gregor 
32fec52635SDouglas Gregor namespace E {
funcE(TYPE arg)33fec52635SDouglas Gregor     template <typename TYPE> int funcE(TYPE arg) { return(arg); }
34fec52635SDouglas Gregor }
35fec52635SDouglas Gregor 
360bba2b61SDouglas Gregor using E::funcE<int>; // expected-error{{using declaration cannot refer to a template specialization}}
37fec52635SDouglas Gregor 
38fec52635SDouglas Gregor namespace F {
39fec52635SDouglas Gregor     struct X;
40fec52635SDouglas Gregor }
41fec52635SDouglas Gregor 
42fec52635SDouglas Gregor using F::X;
43fec52635SDouglas Gregor // Should have some errors here.  Waiting for implementation.
44fec52635SDouglas Gregor void X(int);
45fec52635SDouglas Gregor struct X *x;
46031643efSKaelyn Uhrain 
47031643efSKaelyn Uhrain 
48031643efSKaelyn Uhrain namespace ShadowedTagNotes {
49031643efSKaelyn Uhrain 
50031643efSKaelyn Uhrain namespace foo {
51031643efSKaelyn Uhrain   class Bar {};
52031643efSKaelyn Uhrain }
53031643efSKaelyn Uhrain 
54*3fe3f857SKaelyn Uhrain void Bar(int); // expected-note{{class 'Bar' is hidden by a non-type declaration of 'Bar' here}}
55031643efSKaelyn Uhrain using foo::Bar;
56031643efSKaelyn Uhrain 
ambiguity()57031643efSKaelyn Uhrain void ambiguity() {
58031643efSKaelyn Uhrain    const Bar *x; // expected-error{{must use 'class' tag to refer to type 'Bar' in this scope}}
59031643efSKaelyn Uhrain }
60031643efSKaelyn Uhrain 
61031643efSKaelyn Uhrain } // namespace ShadowedTagNotes
62