13003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s
26180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
36180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// We have to avoid ADL for this test.
46180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
56180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithtemplate <unsigned N> class test {};
66180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
76180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithclass foo {};	// expected-note {{candidate}}
86180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithtest<0> foo(foo); // expected-note {{candidate}}
9840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith
10840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smithnamespace Test0 {
116180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  class foo { int x; };
126180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  test<1> foo(class foo);
136180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
146180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  namespace A {
156180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    test<2> foo(class ::foo); // expected-note {{candidate}} \
166180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    // expected-note{{passing argument to parameter here}}
176180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
186180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    void test0() {
196180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      using ::foo;
206180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
216180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      class foo a;
226180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      test<0> _ = (foo)(a);
236180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    }
246180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
256180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    void test1() {
266180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      using Test0::foo;
276180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
286180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      class foo a;
296180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      test<1> _ = (foo)(a);
305121781d756e7814168b4255a57545d5ca497ec3Aaron Ballman    };
316180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
326180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    void test2() {
336180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      class ::foo a;
346180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
356180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      // Argument-dependent lookup is ambiguous between B:: and ::.
366180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      test<0> _0 = foo(a); // expected-error {{call to 'foo' is ambiguous}}
376180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
38e653ba2f3b6d993b5d410554c12416c03ec7775bRichard Smith      // But basic unqualified lookup is not.
395121781d756e7814168b4255a57545d5ca497ec3Aaron Ballman      test<2> _1 = (foo)(a);
406180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
416180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      class Test0::foo b;
426180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      test<2> _2 = (foo)(b); // expected-error {{no viable conversion from 'class Test0::foo' to 'class ::foo'}}
436180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    }
446180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  }
456180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith}
466180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
475121781d756e7814168b4255a57545d5ca497ec3Aaron Ballmannamespace Test1 {
486180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  namespace A {
496180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    class a {};
506180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  }
516180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
526180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  namespace B {
536180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    typedef class {} b;
546180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  }
556180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
566180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  namespace C {
573003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    int c(); // expected-note {{target of using declaration}}
583003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  }
593003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
603003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  namespace D {
613003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    using typename A::a;
623003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    using typename B::b;
633003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    using typename C::c; // expected-error {{'typename' keyword used on a non-type}}
643003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
653003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    a _1 = A::a();
663003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    b _2 = B::b();
673003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  }
683003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith}
693003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
703003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smithnamespace test2 {
713003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  class A {
723003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  protected:
733003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    operator int();
743003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    operator bool();
753003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  };
763003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
773003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  class B : private A {
783003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  protected:
793003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    using A::operator int; // expected-note {{declared protected here}}
803003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  public:
813003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    using A::operator bool;
823003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  };
833003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
843003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  int test() {
853003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    bool b = B();
863003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    return B(); // expected-error {{'operator int' is a protected member of 'test2::B'}}
873003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  }
883003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith}
893003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
903003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smithnamespace test3 {
913003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  class A {
923003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  public:
933003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    ~A();
943003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  };
953003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
963003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  class B {
973003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    friend class C;
983003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  private:
993003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    operator A*();
1003003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  };
1013003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
1023003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  class C : public B {
1033003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  public:
1043003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    using B::operator A*;
1053003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  };
1063003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith
1073003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  void test() {
1083003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith    delete C();
1093003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith  }
1103003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith}
1113003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith