Home | History | Annotate | Download | only in basic.lookup.classref
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-show-option -verify %s
      2 
      3 template<typename T>
      4 struct set{};
      5 struct Value {
      6   template<typename T>
      7   void set(T value) {}
      8 
      9   void resolves_to_same() {
     10     Value v;
     11     v.set<double>(3.2);
     12   }
     13 };
     14 void resolves_to_different() {
     15   {
     16     Value v;
     17     // The fact that the next line is a warning rather than an error is an
     18     // extension.
     19     v.set<double>(3.2);
     20   }
     21   {
     22     int set;  // Non-template.
     23     Value v;
     24     v.set<double>(3.2);
     25   }
     26 }
     27 
     28 namespace rdar9915664 {
     29   struct A {
     30     template<typename T> void a();
     31   };
     32 
     33   struct B : A { };
     34 
     35   struct C : A { };
     36 
     37   struct D : B, C {
     38     A &getA() { return static_cast<B&>(*this); }
     39 
     40     void test_a() {
     41       getA().a<int>();
     42     }
     43   };
     44 }
     45 
     46 namespace PR11856 {
     47   template<typename T> T end(T);
     48 
     49   template <typename T>
     50   void Foo() {
     51     T it1;
     52     if (it1->end < it1->end) {
     53     }
     54   }
     55 
     56   template<typename T> T *end(T*);
     57 
     58   class X { };
     59   template <typename T>
     60   void Foo2() {
     61     T it1;
     62     if (it1->end < it1->end) {
     63     }
     64 
     65     X *x;
     66     if (x->end < 7) {  // expected-error{{no member named 'end' in 'PR11856::X'}}
     67     }
     68   }
     69 }
     70