blob: a6a4ea0e0f6de208d29163c36da08f49c5758bcd [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Anders Carlsson0d8df782009-08-29 19:37:28 +00002
John McCallfda8e122009-12-03 00:58:24 +00003namespace test0 {
4 namespace N { }
Douglas Gregor48c32a72009-11-17 06:07:40 +00005
John McCallfda8e122009-12-03 00:58:24 +00006 template<typename T>
7 struct A {
8 void f();
9 };
Anders Carlsson0d8df782009-08-29 19:37:28 +000010
John McCallfda8e122009-12-03 00:58:24 +000011 template<typename T>
12 struct B : A<T> {
13 using A<T>::f;
14
15 void g() {
16 using namespace N;
17 f();
18 }
19 };
20
21 template struct B<int>;
22}
23
24namespace test1 {
25 template <class Derived> struct Visitor1 {
26 void Visit(struct Object1*);
27 };
28 template <class Derived> struct Visitor2 {
29 void Visit(struct Object2*); // expected-note {{candidate function}}
30 };
31
32 template <class Derived> struct JoinVisitor
33 : Visitor1<Derived>, Visitor2<Derived> {
34 typedef Visitor1<Derived> Base1;
35 typedef Visitor2<Derived> Base2;
36
37 void Visit(struct Object1*); // expected-note {{candidate function}}
38 using Base2::Visit;
39 };
40
John McCall7002f4c2010-04-09 19:03:51 +000041 class Knot : public JoinVisitor<Knot> {
John McCallfda8e122009-12-03 00:58:24 +000042 };
43
44 void test() {
45 Knot().Visit((struct Object1*) 0);
46 Knot().Visit((struct Object2*) 0);
47 Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}}
Anders Carlsson0d8df782009-08-29 19:37:28 +000048 }
John McCallfda8e122009-12-03 00:58:24 +000049}
John McCall323c3102009-12-22 22:26:37 +000050
51// PR5847
52namespace test2 {
53 namespace ns {
54 void foo();
55 }
56
57 template <class T> void bar(T* ptr) {
58 using ns::foo;
59 foo();
60 }
61
62 template void bar(char *);
63}
Douglas Gregor1b398202010-09-29 17:58:28 +000064
65namespace test3 {
66 template <typename T> struct t {
67 struct s1 {
68 T f1() const;
69 };
70 struct s2 : s1 {
71 using s1::f1;
72 T f1() const;
73 };
74 };
75
76 void f2()
77 {
78 t<int>::s2 a;
79 t<int>::s2 const & b = a;
80 b.f1();
81 }
82}
Eli Friedman13b572c2013-08-20 00:39:40 +000083
84namespace PR16936 {
85 // Make sure both using decls are properly considered for
86 // overload resolution.
87 template<class> struct A {
88 void access(int);
89 };
90 template<class> struct B {
91 void access();
92 };
93 template<class CELL> struct X : public A<CELL>, public B<CELL> {
94 using A<CELL>::access;
95 using B<CELL>::access;
96
97 void f() {
98 access(0);
99 }
100 };
101
102 void f() {
103 X<int> x;
104 x.f();
105 }
106}