// 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 class BaseTemplate { public: T baseTemplateFunction(); T baseTemplateField; static T baseTemplateVariable; }; template class TemplateClass: public Base , public BaseTemplate { 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 void indexSimpleDependentDeclarations(const TemplateClass &object) { // Valid instance members: object.function(); // CHECK: [[@LINE-1]]:10 | instance-method/C++ | function | c:@ST>2#T#T@TemplateClass@F@function# | | Ref,Call,RelCall,RelCont | rel: 1 object.field; // CHECK: [[@LINE-1]]:10 | field/C++ | field | c:@ST>2#T#T@TemplateClass@FI@field | | 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 | | Ref,RelCont | rel: 1 object.baseTemplateFunction(); // CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseTemplateFunction | c:@ST>1#T@BaseTemplate@F@baseTemplateFunction# | | Ref,Call,RelCall,RelCont | rel: 1 object.baseTemplateField; // CHECK: [[@LINE-1]]:10 | field/C++ | baseTemplateField | c:@ST>1#T@BaseTemplate@FI@baseTemplateField | | 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::staticFunction(); // CHECK: [[@LINE-1]]:24 | static-method/C++ | staticFunction | c:@ST>2#T#T@TemplateClass@F@staticFunction#S | | Ref,Call,RelCall,RelCont | rel: 1 TemplateClass::variable; // CHECK: [[@LINE-1]]:24 | static-property/C++ | variable | c:@ST>2#T#T@TemplateClass@variable | __ZN13TemplateClass8variableE | Ref,RelCont | rel: 1 TemplateClass::staticBaseFunction(); // CHECK: [[@LINE-1]]:24 | static-method/C++ | staticBaseFunction | c:@S@Base@F@staticBaseFunction#S | __ZN4Base18staticBaseFunctionEv | Ref,Call,RelCall,RelCont | rel: 1 TemplateClass::baseTemplateVariable; // CHECK: [[@LINE-1]]:24 | static-property/C++ | baseTemplateVariable | c:@ST>1#T@BaseTemplate@baseTemplateVariable | __ZN12BaseTemplate20baseTemplateVariableE | Ref,RelCont | rel: 1 TemplateClass::EnumValue; // CHECK: [[@LINE-1]]:24 | enumerator/C | EnumValue | c:@ST>2#T#T@TemplateClass@E@Enum@EnumValue | | Ref,RelCont | rel: 1 TemplateClass::Struct(); // CHECK: [[@LINE-1]]:24 | struct/C | Struct | c:@ST>2#T#T@TemplateClass@S@Struct | | Ref,Call,RelCall,RelCont | rel: 1 // Invalid static members: TemplateClass::field; // CHECK-NOT: [[@LINE-1]]:24 TemplateClass::function(); // CHECK-NOT: [[@LINE-1]]:24 // Valid type names: typename TemplateClass::Struct Val; // CHECK: [[@LINE-1]]:33 | struct/C | Struct | c:@ST>2#T#T@TemplateClass@S@Struct | | Ref,RelCont | rel: 1 typename TemplateClass::Enum EnumVal; // CHECK: [[@LINE-1]]:33 | enum/C | Enum | c:@ST>2#T#T@TemplateClass@E@Enum | | Ref,RelCont | rel: 1 typename TemplateClass::TypeAlias Val2; // CHECK: [[@LINE-1]]:33 | type-alias/C++ | TypeAlias | c:@ST>2#T#T@TemplateClass@TypeAlias | | Ref,RelCont | rel: 1 typename TemplateClass::Typedef Val3; // CHECK: [[@LINE-1]]:33 | type-alias/C | Typedef | c:{{.*}}index-dependent-source.cpp@ST>2#T#T@TemplateClass@T@Typedef | | Ref,RelCont | rel: 1 // Invalid type names: typename TemplateClass::field Val4; // CHECK-NOT: [[@LINE-1]]:33 typename TemplateClass::staticFunction Val5; // CHECK-NOT: [[@LINE-1]]:33 object.invalid; // CHECK-NOT: [[@LINE-1]]:10 TemplateClass::invalid; // CHECK-NOT: [[@LINE-1]]:24 } template void indexDependentOverloads(const TemplateClass &object) { object.overload1(T()); // CHECK-NOT: [[@LINE-1]] object.overload1(S()); // CHECK-NOT: [[@LINE-1]] object.overload1(Y()); // CHECK-NOT: [[@LINE-1]] } template struct UndefinedTemplateClass; template void undefinedTemplateLookup(UndefinedTemplateClass &x) { // Shouldn't crash! x.lookup; typename UndefinedTemplateClass::Type y; } template struct UserOfUndefinedTemplateClass: UndefinedTemplateClass { }; template void undefinedTemplateLookup2(UserOfUndefinedTemplateClass &x) { // Shouldn't crash! x.lookup; typename UserOfUndefinedTemplateClass::Type y; } template struct Dropper; template struct Trait; template struct Recurse : Trait::Type> { }; template struct Trait : Recurse { }; template void infiniteTraitRecursion(Trait &t) { // Shouldn't crash! t.lookup; }