brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.8 KiB · 8526ed7 Raw
440 lines · cpp
1struct Base1 {2  int member1;3  float member2;4};5 6struct Base2 {7  int member1;8  double member3;9  void memfun1(int);10};11 12struct Base3 : Base1, Base2 {13  void memfun1(float);14  void memfun1(double) const;15  void memfun2(int);16};17 18struct Derived : Base3 {19  template <typename T> Derived(T);20  Derived(int);21  int member4;22  int memfun3(int);23};24 25class Proxy {26public:27  Derived *operator->() const;28};29 30void test(const Proxy &p) {31  p->32}33 34struct Test1 {35  Base1 b;36 37  static void sfunc() {38    b. // expected-error {{invalid use of member 'b' in static member function}}39  }40};41 42struct Foo {43  void foo() const;44  static void foo(bool);45};46 47struct Bar {48  void foo(bool param) {49    Foo::foo(  );// unresolved member expression with an implicit base50  }51};52 53  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:31:6 %s -o - | FileCheck -check-prefix=CHECK-CC1 --implicit-check-not="Derived : Derived(" %s54  // CHECK-CC1: Base1 (InBase) : Base1::55  // CHECK-CC1: member1 (InBase) : [#int#][#Base1::#]member156  // CHECK-CC1: member1 (InBase) : [#int#][#Base2::#]member157  // CHECK-CC1: member2 (InBase) : [#float#][#Base1::#]member258  // CHECK-CC1: member3 (InBase)59  // CHECK-CC1: member460  // CHECK-CC1: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>)61  // CHECK-CC1: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#]62  // CHECK-CC1: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>)63  // CHECK-CC1: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>)64  // CHECK-CC1: memfun3 : [#int#]memfun3(<#int#>)65 66// Make sure this doesn't crash67// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:38:7 %s -verify68 69// Make sure this also doesn't crash70// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:49:14 %s71 72 73template<typename T>74class BaseTemplate {75public:76  T baseTemplateFunction();77 78  T baseTemplateField;79};80 81template<typename T, typename S>82class TemplateClass: public Base1 , public BaseTemplate<T> {83public:84  T function() { }85  T field;86 87  TemplateClass<S, T> &relatedField;88  BaseTemplate<S> &relatedFunction();89 90  void overload1(const T &);91  void overload1(const S &);92};93 94template<typename T, typename S>95void completeDependentMembers(TemplateClass<T, S> &object,96                              TemplateClass<int, S> *object2) {97  object.field;98  object2->field;99// CHECK-CC2: baseTemplateField (InBase) : [#T#][#BaseTemplate<T>::#]baseTemplateField100// CHECK-CC2: baseTemplateFunction (InBase) : [#T#][#BaseTemplate<T>::#]baseTemplateFunction()101// CHECK-CC2: field : [#T#]field102// CHECK-CC2: function : [#T#]function()103// CHECK-CC2: member1 (InBase) : [#int#][#Base1::#]member1104// CHECK-CC2: member2 (InBase) : [#float#][#Base1::#]member2105// CHECK-CC2: overload1 : [#void#]overload1(<#const T &#>)106// CHECK-CC2: overload1 : [#void#]overload1(<#const S &#>)107 108// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:97:10 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s109// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:98:12 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s110 111  auto copy_object = object;112  auto copy_object2 = object2;113  object.field;114  object2->field;115// CHECK-AUTO: field : [#T#]field116// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:113:10 %s -o - | FileCheck -check-prefix=CHECK-AUTO %s117// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:114:12 %s -o - | FileCheck -check-prefix=CHECK-AUTO %s118 119  object.relatedField.relatedFunction().baseTemplateField;120// CHECK-DEP-CHAIN: baseTemplateField : [#T#]baseTemplateField121// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:119:41 %s -o - | FileCheck -check-prefix=CHECK-DEP-CHAIN %s122}123 124 125void completeDependentSpecializedMembers(TemplateClass<int, double> &object,126                                         TemplateClass<int, double> *object2) {127  object.field;128  object2->field;129// CHECK-CC3: baseTemplateField (InBase) : [#int#][#BaseTemplate<int>::#]baseTemplateField130// CHECK-CC3: baseTemplateFunction (InBase) : [#int#][#BaseTemplate<int>::#]baseTemplateFunction()131// CHECK-CC3: field : [#int#]field132// CHECK-CC3: function : [#int#]function()133// CHECK-CC3: member1 (InBase) : [#int#][#Base1::#]member1134// CHECK-CC3: member2 (InBase) : [#float#][#Base1::#]member2135// CHECK-CC3: overload1 : [#void#]overload1(<#const int &#>)136// CHECK-CC3: overload1 : [#void#]overload1(<#const double &#>)137 138// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:127:10 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s139// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:128:12 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s140}141 142template <typename T>143class Template {144public:145  BaseTemplate<int> o1;146  BaseTemplate<T> o2;147 148  void function() {149    o1.baseTemplateField;150// CHECK-CC4: BaseTemplate : BaseTemplate::151// CHECK-CC4: baseTemplateField : [#int#]baseTemplateField152// CHECK-CC4: baseTemplateFunction : [#int#]baseTemplateFunction()153// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:149:8 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s154    o2.baseTemplateField;155// CHECK-CC5: BaseTemplate : BaseTemplate::156// CHECK-CC5: baseTemplateField : [#T#]baseTemplateField157// CHECK-CC5: baseTemplateFunction : [#T#]baseTemplateFunction()158// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:154:8 %s -o - | FileCheck -check-prefix=CHECK-CC5 %s159    this->o1;160// CHECK-CC6: [#void#]function()161// CHECK-CC6: o1 : [#BaseTemplate<int>#]o1162// CHECK-CC6: o2 : [#BaseTemplate<T>#]o2163// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:159:11 %s -o - | FileCheck -check-prefix=CHECK-CC6 %s164  }165 166  static void staticFn(T &obj);167 168  struct Nested { };169};170 171template<typename T>172void dependentColonColonCompletion() {173  Template<T>::staticFn();174// CHECK-CC7: function : [#void#]function()175// CHECK-CC7: Nested : Nested176// CHECK-CC7: o1 : [#BaseTemplate<int>#]o1177// CHECK-CC7: o2 : [#BaseTemplate<T>#]o2178// CHECK-CC7: staticFn : [#void#]staticFn(<#T &obj#>)179// CHECK-CC7: Template : Template180// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:173:16 %s -o - | FileCheck -check-prefix=CHECK-CC7 %s181  typename Template<T>::Nested m;182// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:181:25 %s -o - | FileCheck -check-prefix=CHECK-CC7 %s183}184 185class Proxy2 {186public:187  Derived *operator->() const;188  int member5;189};190 191void test2(const Proxy2 &p) {192  p->193}194 195void test3(const Proxy2 &p) {196  p.197}198 199// RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:192:6 %s -o - | FileCheck -check-prefix=CHECK-CC8 --implicit-check-not="Derived : Derived(" %s200// CHECK-CC8: Base1 (InBase) : Base1::201// CHECK-CC8: member1 (InBase) : [#int#][#Base1::#]member1202// CHECK-CC8: member1 (InBase) : [#int#][#Base2::#]member1203// CHECK-CC8: member2 (InBase) : [#float#][#Base1::#]member2204// CHECK-CC8: member3 (InBase) : [#double#][#Base2::#]member3205// CHECK-CC8: member4 : [#int#]member4206// CHECK-CC8: member5 : [#int#]member5 (requires fix-it: {192:4-192:6} to ".")207// CHECK-CC8: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>)208// CHECK-CC8: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#]209// CHECK-CC8: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>)210// CHECK-CC8: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>)211// CHECK-CC8: memfun3 : [#int#]memfun3(<#int#>)212// CHECK-CC8: operator-> : [#Derived *#]operator->()[# const#] (requires fix-it: {192:4-192:6} to ".")213 214// RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:196:6 %s -o - | FileCheck -check-prefix=CHECK-CC9 --implicit-check-not="Derived : Derived(" %s215// CHECK-CC9: Base1 (InBase) : Base1::216// CHECK-CC9: member1 (InBase) : [#int#][#Base1::#]member1 (requires fix-it: {196:4-196:5} to "->")217// CHECK-CC9: member1 (InBase) : [#int#][#Base2::#]member1 (requires fix-it: {196:4-196:5} to "->")218// CHECK-CC9: member2 (InBase) : [#float#][#Base1::#]member2 (requires fix-it: {196:4-196:5} to "->")219// CHECK-CC9: member3 (InBase) : [#double#][#Base2::#]member3 (requires fix-it: {196:4-196:5} to "->")220// CHECK-CC9: member4 : [#int#]member4 (requires fix-it: {196:4-196:5} to "->")221// CHECK-CC9: member5 : [#int#]member5222// CHECK-CC9: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>) (requires fix-it: {196:4-196:5} to "->")223// CHECK-CC9: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#] (requires fix-it: {196:4-196:5} to "->")224// CHECK-CC9: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>) (requires fix-it: {196:4-196:5} to "->")225// CHECK-CC9: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>) (requires fix-it: {196:4-196:5} to "->")226// CHECK-CC9: memfun3 : [#int#]memfun3(<#int#>) (requires fix-it: {196:4-196:5} to "->")227// CHECK-CC9: operator-> : [#Derived *#]operator->()[# const#]228 229// These overload sets differ only by return type and this-qualifiers.230// So for any given callsite, only one is available.231struct Overloads {232  double ConstOverload(char);233  int ConstOverload(char) const;234 235  int RefOverload(char) &;236  double RefOverload(char) const&;237  char RefOverload(char) &&;238};239void testLValue(Overloads& Ref) {240  Ref.241}242void testConstLValue(const Overloads& ConstRef) {243  ConstRef.244}245void testRValue() {246  Overloads().247}248void testXValue(Overloads& X) {249  static_cast<Overloads&&>(X).250}251 252// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:240:7 %s -o - | FileCheck -check-prefix=CHECK-LVALUE %s \253// RUN: --implicit-check-not="[#int#]ConstOverload(" \254// RUN: --implicit-check-not="[#double#]RefOverload(" \255// RUN: --implicit-check-not="[#char#]RefOverload("256// CHECK-LVALUE-DAG: [#double#]ConstOverload(257// CHECK-LVALUE-DAG: [#int#]RefOverload(258 259// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:243:12 %s -o - | FileCheck -check-prefix=CHECK-CONSTLVALUE %s \260// RUN: --implicit-check-not="[#double#]ConstOverload(" \261// RUN: --implicit-check-not="[#int#]RefOverload(" \262// RUN: --implicit-check-not="[#char#]RefOverload("263// CHECK-CONSTLVALUE: [#int#]ConstOverload(264// CHECK-CONSTLVALUE: [#double#]RefOverload(265 266// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:246:15 %s -o - | FileCheck -check-prefix=CHECK-PRVALUE %s \267// RUN: --implicit-check-not="[#int#]ConstOverload(" \268// RUN: --implicit-check-not="[#int#]RefOverload(" \269// RUN: --implicit-check-not="[#double#]RefOverload("270// CHECK-PRVALUE: [#double#]ConstOverload(271// CHECK-PRVALUE: [#char#]RefOverload(272 273// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:249:31 %s -o - | FileCheck -check-prefix=CHECK-XVALUE %s \274// RUN: --implicit-check-not="[#int#]ConstOverload(" \275// RUN: --implicit-check-not="[#int#]RefOverload(" \276// RUN: --implicit-check-not="[#double#]RefOverload("277// CHECK-XVALUE: [#double#]ConstOverload(278// CHECK-XVALUE: [#char#]RefOverload(279 280void testOverloadOperator() {281  struct S {282    char operator=(int) const;283    int operator=(int);284  } s;285  return s.286}287// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:285:12 %s -o - | FileCheck -check-prefix=CHECK-OPER %s \288// RUN: --implicit-check-not="[#char#]operator=("289// CHECK-OPER: [#int#]operator=(290 291struct S { int member; };292S overloaded(int);293S overloaded(double);294void foo() {295  // No overload matches, but we have recovery-expr with the correct type.296  overloaded().297}298// RUN: not %clang_cc1 -fsyntax-only -frecovery-ast -frecovery-ast-type -code-completion-at=%s:296:16 %s -o - | FileCheck -check-prefix=CHECK-RECOVERY %s299// CHECK-RECOVERY: [#int#]member300template <typename T>301void fooDependent(T t) {302  // Overload not resolved, but we notice all candidates return the same type.303  overloaded(t).304}305// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:303:17 %s -o - | FileCheck -check-prefix=CHECK-OVERLOAD %s306// CHECK-OVERLOAD: [#int#]member307 308struct Base4 {309  Base4 base4();310};311 312template <typename T>313struct Derived2 : Base4 {};314 315template <typename T>316void testMembersFromBasesInDependentContext() {317  Derived2<T> X;318  (void)X.base4().base4();319  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:318:19 %s -o - | FileCheck -check-prefix=CHECK-MEMBERS-FROM-BASE-DEPENDENT %s320  // CHECK-MEMBERS-FROM-BASE-DEPENDENT: [#Base4#]base4321}322 323namespace members_using_fixits {324  struct Bar {325    void method();326    int field;327  };328  struct Baz: Bar {329    using Bar::method;330    using Bar::field;331  };332  void testMethod(Baz* ptr) {333    ptr.m334  }335  // RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:333:10 %s -o - | FileCheck -check-prefix=CHECK-METHOD-DECLARED-VIA-USING %s336  // CHECK-METHOD-DECLARED-VIA-USING: [#void#]method() (requires fix-it: {333:8-333:9} to "->")337 338  void testField(Baz* ptr) {339    ptr.f340  }341  // RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:339:10 %s -o - | FileCheck -check-prefix=CHECK-FIELD-DECLARED-VIA-USING %s342  // CHECK-FIELD-DECLARED-VIA-USING: [#int#]field (requires fix-it: {339:8-339:9} to "->")343}344 345namespace function_can_be_call {346  struct S {347    template <typename T, typename U, typename V = int>348    T foo(U, V);349  };350 351  void test() {352    &S::f353  }354  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:352:9 %s -o - | FileCheck -check-prefix=CHECK_FUNCTION_CAN_BE_CALL %s355  // CHECK_FUNCTION_CAN_BE_CALL: COMPLETION: foo : [#T#]foo<<#typename T#>, <#typename U#>>(<#U#>, <#V#>)356}357 358namespace deref_dependent_this {359template <typename T>360class A {361  int field;362 363  void function() {364    (*this).field;365// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:364:13 %s -o - | FileCheck -check-prefix=CHECK-DEREF-THIS %s366// CHECK-DEREF-THIS: field : [#int#]field367// CHECK-DEREF-THIS: [#void#]function()368  }369};370 371template <typename Element>372struct RepeatedField {373  void Add();374};375 376template <typename T>377RepeatedField<T>* MutableRepeatedField() {}378 379template <class T>380void Foo() {381  auto& C = *MutableRepeatedField<T>();382  C.383}384// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:382:5 %s -o - | FileCheck -check-prefix=CHECK-DEREF-DEPENDENT %s385// CHECK-DEREF-DEPENDENT: [#void#]Add()386}387 388namespace dependent_smart_pointer {389template <typename T>390struct smart_pointer {391  T* operator->();392};393 394template <typename T>395struct node {396  smart_pointer<node<T>> next;397  void foo() {398    next->next;399    // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:398:11 %s -o - | FileCheck -check-prefix=CHECK-DEPENDENT-SMARTPTR %s400    // CHECK-DEPENDENT-SMARTPTR: [#smart_pointer<node<T>>#]next401  }402};403}404 405namespace dependent_nested_class {406template <typename T>407struct Foo {408  struct Bar {409    int field;410  };411};412template <typename T>413void f() {414  typename Foo<T>::Bar bar;415  bar.field;416  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:415:7 %s -o - | FileCheck -check-prefix=CHECK-DEPENDENT-NESTEDCLASS %s417  // CHECK-DEPENDENT-NESTEDCLASS: [#int#]field418}419}420 421namespace template_alias {422struct A {423  int b;424};425template <typename T>426struct S {427  A a;428};429template <typename T>430using Alias = S<T>;431template <typename T>432void f(Alias<T> s) {433  s.a.b;434  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:433:5 %s -o - | FileCheck -check-prefix=CHECK-TEMPLATE-ALIAS %s435  // CHECK-TEMPLATE-ALIAS: [#A#]a436  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:433:7 %s -o - | FileCheck -check-prefix=CHECK-TEMPLATE-ALIAS-NESTED %s437  // CHECK-TEMPLATE-ALIAS-NESTED: [#int#]b438}439}440