brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 61e60ae Raw
162 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s 2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s4 5namespace A6{7    namespace B8    {9        struct base10#if __cplusplus <= 199711L11        // expected-note@-2 {{lookup in the object type 'A::sub' refers here}}12#endif13        {14            void x() {}15            void y() {}16        };17    }18 19    struct member20    {21        void foo();22    };23 24    struct middleman25    {26        member * operator->() { return 0; }27    };28 29    struct sub : B::base30    {31        void x() {}32        middleman operator->() { return middleman(); }33    };34}35 36struct bad37{38  int x();39};40 41namespace C42{43    void fun()44    {45        A::sub a;46 47        a.x();48    49        a.sub::x();50        a.base::x();51 52        a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}53 54        a.A::sub::x();55        a.A::B::base::x();56 57        a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}58 59        a->foo();60        a->member::foo();61        a->A::member::foo();62    }63 64    void fun2()65    {66        A::sub *a;67 68        a->x();69 70        a->sub::x();71        a->base::x();72 73        a->B::base::x(); // expected-error{{use of undeclared identifier 'B'}}74 75        a->A::sub::x();76        a->A::B::base::x();77 78        a->bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}79 80        (*a)->foo();81        (*a)->member::foo();82        (*a)->A::member::foo();83    }84 85    void fun3()86    {87        int i;88        i.foo(); // expected-error{{member reference base type 'int' is not a structure or union}}89    }90 91    void fun4a() {92      A::sub *a;93      94      typedef A::member base;95#if __cplusplus <= 199711L96      // expected-note@-2 {{lookup from the current scope refers here}}97#endif98      a->base::x();99#if __cplusplus <= 199711L100      // expected-error@-2 {{lookup of 'base' in member access expression is ambiguous}}101#endif102    }103 104    void fun4b() {105      A::sub *a;106      107      typedef A::B::base base;108      a->base::x();109    }110  111    template<typename T>112    void fun5()113    {114        T a;115        a.x();116        a->foo();117 118        a.A::sub::x();119        a.A::B::base::x();120        a->A::member::foo();121 122        a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}123    }124 125  void test_fun5() {126    fun5<A::sub>(); // expected-note{{instantiation}}127  }128  129  template<typename T>130  void fun6() {131    T a;132    a.sub::x();133    a.base::x();134    a->member::foo();135    a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}136   }137  138  void test_fun6() {139    fun6<A::sub>(); // expected-note{{instantiation}}140  }141  142}143 144// PR4703145struct a {146  int a;147  static int sa;148};149 150a a;151 152int a::sa = a.a; // expected-error {{invalid use of non-static data member 'a'}}153 154 155namespace PR6645 {156  typedef int foo;157  namespace Inner {158    typedef int PR6645::foo; // expected-error{{typedef declarator cannot be qualified}} \159    // expected-error{{cannot define or redeclare 'foo' here because namespace 'Inner' does not enclose namespace 'PR6645'}}160  }161}162