150 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s 
 | 
						|
namespace A
 | 
						|
{
 | 
						|
    namespace B
 | 
						|
    {
 | 
						|
        struct base // expected-note{{object type}}
 | 
						|
        {
 | 
						|
            void x() {}
 | 
						|
            void y() {}
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    struct member
 | 
						|
    {
 | 
						|
        void foo();
 | 
						|
    };
 | 
						|
 | 
						|
    struct middleman
 | 
						|
    {
 | 
						|
        member * operator->() { return 0; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct sub : B::base
 | 
						|
    {
 | 
						|
        void x() {}
 | 
						|
        middleman operator->() { return middleman(); }
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
struct bad
 | 
						|
{
 | 
						|
  int x();
 | 
						|
};
 | 
						|
 | 
						|
namespace C
 | 
						|
{
 | 
						|
    void fun()
 | 
						|
    {
 | 
						|
        A::sub a;
 | 
						|
 | 
						|
        a.x();
 | 
						|
    
 | 
						|
        a.sub::x();
 | 
						|
        a.base::x();
 | 
						|
 | 
						|
        a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
 | 
						|
 | 
						|
        a.A::sub::x();
 | 
						|
        a.A::B::base::x();
 | 
						|
 | 
						|
        a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
 | 
						|
 | 
						|
        a->foo();
 | 
						|
        a->member::foo();
 | 
						|
        a->A::member::foo();
 | 
						|
    }
 | 
						|
 | 
						|
    void fun2()
 | 
						|
    {
 | 
						|
        A::sub *a;
 | 
						|
 | 
						|
        a->x();
 | 
						|
 | 
						|
        a->sub::x();
 | 
						|
        a->base::x();
 | 
						|
 | 
						|
        a->B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
 | 
						|
 | 
						|
        a->A::sub::x();
 | 
						|
        a->A::B::base::x();
 | 
						|
 | 
						|
        a->bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
 | 
						|
 | 
						|
        (*a)->foo();
 | 
						|
        (*a)->member::foo();
 | 
						|
        (*a)->A::member::foo();
 | 
						|
    }
 | 
						|
 | 
						|
    void fun3()
 | 
						|
    {
 | 
						|
        int i;
 | 
						|
        i.foo(); // expected-error{{member reference base type 'int' is not a structure or union}}
 | 
						|
    }
 | 
						|
 | 
						|
    void fun4a() {
 | 
						|
      A::sub *a;
 | 
						|
      
 | 
						|
      typedef A::member base; // expected-note{{current scope}}
 | 
						|
      a->base::x(); // expected-error{{ambiguous}}      
 | 
						|
    }
 | 
						|
 | 
						|
    void fun4b() {
 | 
						|
      A::sub *a;
 | 
						|
      
 | 
						|
      typedef A::B::base base;
 | 
						|
      a->base::x();
 | 
						|
    }
 | 
						|
  
 | 
						|
    template<typename T>
 | 
						|
    void fun5()
 | 
						|
    {
 | 
						|
        T a;
 | 
						|
        a.x();
 | 
						|
        a->foo();
 | 
						|
 | 
						|
        a.A::sub::x();
 | 
						|
        a.A::B::base::x();
 | 
						|
        a->A::member::foo();
 | 
						|
 | 
						|
        a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
 | 
						|
    }
 | 
						|
 | 
						|
  void test_fun5() {
 | 
						|
    fun5<A::sub>(); // expected-note{{instantiation}}
 | 
						|
  }
 | 
						|
  
 | 
						|
  template<typename T>
 | 
						|
  void fun6() {
 | 
						|
    T a;
 | 
						|
    a.sub::x();
 | 
						|
    a.base::x();
 | 
						|
    a->member::foo();
 | 
						|
    a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
 | 
						|
   }
 | 
						|
  
 | 
						|
  void test_fun6() {
 | 
						|
    fun6<A::sub>(); // expected-note{{instantiation}}
 | 
						|
  }
 | 
						|
  
 | 
						|
}
 | 
						|
 | 
						|
// PR4703
 | 
						|
struct a {
 | 
						|
  int a;
 | 
						|
  static int sa;
 | 
						|
};
 | 
						|
 | 
						|
a a;
 | 
						|
 | 
						|
int a::sa = a.a; // expected-error {{invalid use of non-static data member 'a'}}
 | 
						|
 | 
						|
 | 
						|
namespace PR6645 {
 | 
						|
  typedef int foo;
 | 
						|
  namespace Inner {
 | 
						|
    typedef int PR6645::foo; // expected-error{{typedef declarator cannot be qualified}} \
 | 
						|
    // expected-error{{cannot define or redeclare 'foo' here because namespace 'Inner' does not enclose namespace 'PR6645'}}
 | 
						|
  }
 | 
						|
}
 |