Home | History | Annotate | Download | only in expr.prim.general
      1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
      2 
      3 struct A {
      4   int &f(int*);
      5   float &f(int*) const noexcept;
      6 
      7   int *ptr;
      8   auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(this->ptr));
      9   auto g2() const noexcept(noexcept(f((*this).ptr))) -> decltype(f(ptr));
     10 };
     11 
     12 void testA(A &a) {
     13   int &ir = a.g1();
     14   float &fr = a.g2();
     15   static_assert(!noexcept(a.g1()), "exception-specification failure");
     16   static_assert(noexcept(a.g2()), "exception-specification failure");
     17 }
     18 
     19 struct B {
     20   char g();
     21   template<class T> auto f(T t) -> decltype(t + g())
     22   { return t + g(); }
     23 };
     24 
     25 template auto B::f(int t) -> decltype(t + g());
     26 
     27 template<typename T>
     28 struct C {
     29   int &f(T*);
     30   float &f(T*) const noexcept;
     31 
     32   T* ptr;
     33   auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(ptr));
     34   auto g2() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(ptr));
     35   auto g3() noexcept(noexcept(f(this->ptr))) -> decltype(f((*this).ptr));
     36   auto g4() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(this->ptr));
     37   auto g5() noexcept(noexcept(this->f(ptr))) -> decltype(this->f(ptr));
     38   auto g6() const noexcept(noexcept(this->f(((this))->ptr))) -> decltype(this->f(ptr));
     39   auto g7() noexcept(noexcept(this->f(this->ptr))) -> decltype(this->f((*this).ptr));
     40   auto g8() const noexcept(noexcept(this->f(((this))->ptr))) -> decltype(this->f(this->ptr));
     41 };
     42 
     43 void test_C(C<int> ci) {
     44   int &ir = ci.g1();
     45   float &fr = ci.g2();
     46   int &ir2 = ci.g3();
     47   float &fr2 = ci.g4();
     48   int &ir3 = ci.g5();
     49   float &fr3 = ci.g6();
     50   int &ir4 = ci.g7();
     51   float &fr4 = ci.g8();
     52   static_assert(!noexcept(ci.g1()), "exception-specification failure");
     53   static_assert(noexcept(ci.g2()), "exception-specification failure");
     54   static_assert(!noexcept(ci.g3()), "exception-specification failure");
     55   static_assert(noexcept(ci.g4()), "exception-specification failure");
     56   static_assert(!noexcept(ci.g5()), "exception-specification failure");
     57   static_assert(noexcept(ci.g6()), "exception-specification failure");
     58   static_assert(!noexcept(ci.g7()), "exception-specification failure");
     59   static_assert(noexcept(ci.g8()), "exception-specification failure");
     60 }
     61 
     62 namespace PR14263 {
     63   template<typename T> struct X {
     64     void f();
     65     T f() const;
     66 
     67     auto g()       -> decltype(this->f()) { return f(); }
     68     auto g() const -> decltype(this->f()) { return f(); }
     69   };
     70   template struct X<int>;
     71 }
     72 
     73 namespace PR10036 {
     74   template <class I>
     75   void
     76   iter_swap(I x, I y) noexcept;
     77 
     78   template <class T>
     79   class A
     80   {
     81     T t_;
     82   public:
     83     void swap(A& a) noexcept(noexcept(iter_swap(&t_, &a.t_)));
     84   };
     85 
     86   void test() {
     87     A<int> i, j;
     88     i.swap(j);
     89   }
     90 }
     91 
     92 namespace PR15290 {
     93   template<typename T>
     94   class A {
     95     T v_;
     96     friend int add_to_v(A &t) noexcept(noexcept(v_ + 42))
     97     {
     98       return t.v_ + 42;
     99     }
    100   };
    101   void f()
    102   {
    103     A<int> t;
    104     add_to_v(t);
    105   }
    106 }
    107 
    108 namespace Static {
    109   struct X1 {
    110     int m;
    111     // FIXME: This should be accepted.
    112     static auto f() -> decltype(m); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
    113     static auto g() -> decltype(this->m); // expected-error{{'this' cannot be used in a static member function declaration}}
    114 
    115     static int h();
    116 
    117     static int i() noexcept(noexcept(m + 2)); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
    118   };
    119 
    120   auto X1::h() -> decltype(m) { return 0; } // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
    121 
    122   template<typename T>
    123   struct X2 {
    124     int m;
    125 
    126     T f(T*);
    127     static T f(int);
    128 
    129     auto g(T x) -> decltype(f(x)) { return 0; }
    130   };
    131 
    132   void test_X2() {
    133     X2<int>().g(0);
    134   }
    135 }
    136 
    137 namespace PR12564 {
    138   struct Base {
    139     void bar(Base&) {}
    140   };
    141 
    142   struct Derived : Base {
    143     void foo(Derived& d) noexcept(noexcept(d.bar(d))) {}
    144   };
    145 }
    146 
    147 namespace rdar13473493 {
    148   template <typename F>
    149   class wrap
    150   {
    151   public:
    152     template <typename... Args>
    153     auto operator()(Args&&... args) const -> decltype(wrapped(args...)) // expected-note{{candidate template ignored: substitution failure [with Args = <int>]: use of undeclared identifier 'wrapped'}}
    154     {
    155       return wrapped(args...);
    156     }
    157 
    158   private:
    159     F wrapped;
    160   };
    161 
    162   void test(wrap<int (*)(int)> w) {
    163     w(5); // expected-error{{no matching function for call to object of type 'wrap<int (*)(int)>'}}
    164   }
    165 }
    166