p1.cpp revision a5728872c7702ddd09537c95bc3cbd20e1f2fb09
1// RUN: %clang_cc1 -emit-llvm-only %s
2
3template <typename T> struct Num {
4  T value_;
5
6public:
7  Num(T value) : value_(value) {}
8  T get() const { return value_; }
9
10  template <typename U> struct Rep {
11    U count_;
12    Rep(U count) : count_(count) {}
13
14    friend Num operator*(const Num &a, const Rep &n) {
15      Num x = 0;
16      for (U count = n.count_; count; --count)
17        x += a;
18      return x;
19    }
20  };
21
22  friend Num operator+(const Num &a, const Num &b) {
23    return a.value_ + b.value_;
24  }
25
26  Num& operator+=(const Num& b) {
27    value_ += b.value_;
28    return *this;
29  }
30
31  class Representation {};
32  friend class Representation;
33};
34
35class A {
36  template <typename T> friend bool iszero(const A &a) throw();
37};
38
39template <class T> class B_iterator;
40template <class T> class B {
41  friend class B_iterator<T>;
42};
43
44int calc1() {
45  Num<int> left = -1;
46  Num<int> right = 1;
47  Num<int> result = left + right;
48  return result.get();
49}
50
51int calc2() {
52  Num<int> x = 3;
53  Num<int>::Rep<char> n = (char) 10;
54  Num<int> result = x * n;
55  return result.get();
56}
57