diff options
| author | Carlo Zancanaro <carlo@pc-4w14-0.cs.usyd.edu.au> | 2012-10-15 17:10:06 +1100 | 
|---|---|---|
| committer | Carlo Zancanaro <carlo@pc-4w14-0.cs.usyd.edu.au> | 2012-10-15 17:10:06 +1100 | 
| commit | be1de4be954c80875ad4108e0a33e8e131b2f2c0 (patch) | |
| tree | 1fbbecf276bf7c7bdcbb4dd446099d6d90eaa516 /clang/test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp | |
| parent | c4626a62754862d20b41e8a46a3574264ea80e6d (diff) | |
| parent | f1bd2e48c5324d3f7cda4090c87f8a5b6f463ce2 (diff) | |
Merge branch 'master' of ssh://bitbucket.org/czan/honours
Diffstat (limited to 'clang/test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp')
| -rw-r--r-- | clang/test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp | 89 | 
1 files changed, 89 insertions, 0 deletions
| diff --git a/clang/test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp b/clang/test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp new file mode 100644 index 0000000..c207283 --- /dev/null +++ b/clang/test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp @@ -0,0 +1,89 @@ +// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-show-option -verify %s + +// C++98 [basic.lookup.classref]p1: +//   In a class member access expression (5.2.5), if the . or -> token is +//   immediately followed by an identifier followed by a <, the identifier must +//   be looked up to determine whether the < is the beginning of a template +//   argument list (14.2) or a less-than operator. The identifier is first +//   looked up in the class of the object expression. If the identifier is not +//   found, it is then looked up in the context of the entire postfix-expression +//   and shall name a class or function template. If the lookup in the class of +//   the object expression finds a template, the name is also looked up in the +//   context of the entire postfix-expression and +//    -- if the name is not found, the name found in the class of the object +//       expression is used, otherwise +//    -- if the name is found in the context of the entire postfix-expression +//       and does not name a class template, the name found in the class of the +//       object expression is used, otherwise +//    -- if the name found is a class template, it must refer to the same +//       entity as the one found in the class of the object expression, +//       otherwise the program is ill-formed. + +// From PR 7247 +template<typename T> +struct set{};  // expected-note{{lookup from the current scope refers here}} +struct Value { +  template<typename T> +  void set(T value) {}  // expected-note{{lookup in the object type 'Value' refers here}} + +  void resolves_to_same() { +    Value v; +    v.set<double>(3.2); +  } +}; +void resolves_to_different() { +  { +    Value v; +    // The fact that the next line is a warning rather than an error is an +    // extension. +    v.set<double>(3.2);  // expected-warning{{lookup of 'set' in member access expression is ambiguous; using member of 'Value'}} +  } +  { +    int set;  // Non-template. +    Value v; +    v.set<double>(3.2); +  } +} + +namespace rdar9915664 { +  struct A { +    template<typename T> void a(); +  }; + +  struct B : A { }; + +  struct C : A { }; + +  struct D : B, C { +    A &getA() { return static_cast<B&>(*this); } + +    void test_a() { +      getA().a<int>(); +    } +  }; +} + +namespace PR11856 { +  template<typename T> T end(T); + +  template <typename T> +  void Foo() { +    T it1; +    if (it1->end < it1->end) { +    } +  } + +  template<typename T> T *end(T*); + +  class X { }; +  template <typename T> +  void Foo2() { +    T it1; +    if (it1->end < it1->end) { +    } + +    X *x; +    if (x->end < 7) {  // expected-error{{no member named 'end' in 'PR11856::X'}} +    } +  } +} | 
