161 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: c-index-test core -print-source-symbols -- %s -std=c++14 -target x86_64-apple-macosx10.7 | FileCheck %s
 | 
						|
 | 
						|
int invalid;
 | 
						|
 | 
						|
class Base {
 | 
						|
  void baseFunction();
 | 
						|
 | 
						|
  int baseField;
 | 
						|
 | 
						|
  static void staticBaseFunction();
 | 
						|
};
 | 
						|
 | 
						|
template<typename T>
 | 
						|
class BaseTemplate {
 | 
						|
public:
 | 
						|
  T baseTemplateFunction();
 | 
						|
 | 
						|
  T baseTemplateField;
 | 
						|
 | 
						|
  static T baseTemplateVariable;
 | 
						|
};
 | 
						|
 | 
						|
template<typename T, typename S>
 | 
						|
class TemplateClass: public Base , public BaseTemplate<T> {
 | 
						|
public:
 | 
						|
  ~TemplateClass();
 | 
						|
 | 
						|
  T function() { }
 | 
						|
 | 
						|
  static void staticFunction() { }
 | 
						|
 | 
						|
  T field;
 | 
						|
 | 
						|
  static T variable;
 | 
						|
 | 
						|
  struct Struct { };
 | 
						|
 | 
						|
  enum Enum { EnumValue };
 | 
						|
 | 
						|
  using TypeAlias = S;
 | 
						|
  typedef T Typedef;
 | 
						|
 | 
						|
  void overload1(const T &);
 | 
						|
  void overload1(const S &);
 | 
						|
};
 | 
						|
 | 
						|
template<typename T, typename S>
 | 
						|
void indexSimpleDependentDeclarations(const TemplateClass<T, S> &object) {
 | 
						|
  // Valid instance members:
 | 
						|
  object.function();
 | 
						|
// CHECK: [[@LINE-1]]:10 | instance-method/C++ | function | c:@ST>2#T#T@TemplateClass@F@function# | <no-cgname> | Ref,Call,RelCall,RelCont | rel: 1
 | 
						|
  object.field;
 | 
						|
// CHECK: [[@LINE-1]]:10 | field/C++ | field | c:@ST>2#T#T@TemplateClass@FI@field | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
  object.baseFunction();
 | 
						|
// CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseFunction | c:@S@Base@F@baseFunction# | __ZN4Base12baseFunctionEv | Ref,Call,RelCall,RelCont | rel: 1
 | 
						|
  object.baseField;
 | 
						|
// CHECK: [[@LINE-1]]:10 | field/C++ | baseField | c:@S@Base@FI@baseField | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
  object.baseTemplateFunction();
 | 
						|
// CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseTemplateFunction | c:@ST>1#T@BaseTemplate@F@baseTemplateFunction# | <no-cgname> | Ref,Call,RelCall,RelCont | rel: 1
 | 
						|
  object.baseTemplateField;
 | 
						|
// CHECK: [[@LINE-1]]:10 | field/C++ | baseTemplateField | c:@ST>1#T@BaseTemplate@FI@baseTemplateField | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
 | 
						|
  // Invalid instance members:
 | 
						|
  object.variable;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:10
 | 
						|
  object.staticFunction();
 | 
						|
// CHECK-NOT: [[@LINE-1]]:10
 | 
						|
  object.Struct;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:10
 | 
						|
  object.EnumValue;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:10
 | 
						|
 | 
						|
  // Valid static members:
 | 
						|
  TemplateClass<T, S>::staticFunction();
 | 
						|
// CHECK: [[@LINE-1]]:24 | static-method/C++ | staticFunction | c:@ST>2#T#T@TemplateClass@F@staticFunction#S | <no-cgname> | Ref,Call,RelCall,RelCont | rel: 1
 | 
						|
  TemplateClass<T, S>::variable;
 | 
						|
// CHECK: [[@LINE-1]]:24 | static-property/C++ | variable | c:@ST>2#T#T@TemplateClass@variable | __ZN13TemplateClass8variableE | Ref,RelCont | rel: 1
 | 
						|
  TemplateClass<T, S>::staticBaseFunction();
 | 
						|
// CHECK: [[@LINE-1]]:24 | static-method/C++ | staticBaseFunction | c:@S@Base@F@staticBaseFunction#S | __ZN4Base18staticBaseFunctionEv | Ref,Call,RelCall,RelCont | rel: 1
 | 
						|
  TemplateClass<T, S>::baseTemplateVariable;
 | 
						|
// CHECK: [[@LINE-1]]:24 | static-property/C++ | baseTemplateVariable | c:@ST>1#T@BaseTemplate@baseTemplateVariable | __ZN12BaseTemplate20baseTemplateVariableE | Ref,RelCont | rel: 1
 | 
						|
  TemplateClass<T, S>::EnumValue;
 | 
						|
// CHECK: [[@LINE-1]]:24 | enumerator/C | EnumValue | c:@ST>2#T#T@TemplateClass@E@Enum@EnumValue | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
  TemplateClass<T, S>::Struct();
 | 
						|
// CHECK: [[@LINE-1]]:24 | struct/C | Struct | c:@ST>2#T#T@TemplateClass@S@Struct | <no-cgname> | Ref,Call,RelCall,RelCont | rel: 1
 | 
						|
 | 
						|
  // Invalid static members:
 | 
						|
  TemplateClass<T, S>::field;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:24
 | 
						|
  TemplateClass<T, S>::function();
 | 
						|
// CHECK-NOT: [[@LINE-1]]:24
 | 
						|
 | 
						|
  // Valid type names:
 | 
						|
  typename TemplateClass<T, S>::Struct Val;
 | 
						|
// CHECK: [[@LINE-1]]:33 | struct/C | Struct | c:@ST>2#T#T@TemplateClass@S@Struct | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
  typename TemplateClass<T, S>::Enum EnumVal;
 | 
						|
// CHECK: [[@LINE-1]]:33 | enum/C | Enum | c:@ST>2#T#T@TemplateClass@E@Enum | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
  typename TemplateClass<T, S>::TypeAlias Val2;
 | 
						|
// CHECK: [[@LINE-1]]:33 | type-alias/C++ | TypeAlias | c:@ST>2#T#T@TemplateClass@TypeAlias | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
  typename TemplateClass<T, S>::Typedef Val3;
 | 
						|
// CHECK: [[@LINE-1]]:33 | type-alias/C | Typedef | c:{{.*}}index-dependent-source.cpp@ST>2#T#T@TemplateClass@T@Typedef | <no-cgname> | Ref,RelCont | rel: 1
 | 
						|
 | 
						|
  // Invalid type names:
 | 
						|
  typename TemplateClass<T, S>::field Val4;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:33
 | 
						|
  typename TemplateClass<T, S>::staticFunction Val5;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:33
 | 
						|
 | 
						|
 | 
						|
  object.invalid;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:10
 | 
						|
  TemplateClass<T, S>::invalid;
 | 
						|
// CHECK-NOT: [[@LINE-1]]:24
 | 
						|
}
 | 
						|
 | 
						|
template<typename T, typename S, typename Y>
 | 
						|
void indexDependentOverloads(const TemplateClass<T, S> &object) {
 | 
						|
  object.overload1(T());
 | 
						|
// CHECK-NOT: [[@LINE-1]]
 | 
						|
  object.overload1(S());
 | 
						|
// CHECK-NOT: [[@LINE-1]]
 | 
						|
  object.overload1(Y());
 | 
						|
// CHECK-NOT: [[@LINE-1]]
 | 
						|
}
 | 
						|
 | 
						|
template<typename T> struct UndefinedTemplateClass;
 | 
						|
 | 
						|
template<typename T>
 | 
						|
void undefinedTemplateLookup(UndefinedTemplateClass<T> &x) {
 | 
						|
// Shouldn't crash!
 | 
						|
  x.lookup;
 | 
						|
  typename UndefinedTemplateClass<T>::Type y;
 | 
						|
}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct UserOfUndefinedTemplateClass: UndefinedTemplateClass<T> { };
 | 
						|
 | 
						|
template<typename T>
 | 
						|
void undefinedTemplateLookup2(UserOfUndefinedTemplateClass<T> &x) {
 | 
						|
// Shouldn't crash!
 | 
						|
  x.lookup;
 | 
						|
  typename UserOfUndefinedTemplateClass<T>::Type y;
 | 
						|
}
 | 
						|
 | 
						|
template<typename T> struct Dropper;
 | 
						|
 | 
						|
template<typename T> struct Trait;
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct Recurse : Trait<typename Dropper<T>::Type> { };
 | 
						|
 | 
						|
template<typename T>
 | 
						|
struct Trait : Recurse<T> {
 | 
						|
};
 | 
						|
 | 
						|
template<typename T>
 | 
						|
void infiniteTraitRecursion(Trait<T> &t) {
 | 
						|
// Shouldn't crash!
 | 
						|
  t.lookup;
 | 
						|
}
 |