brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · c63160f Raw
105 lines · cpp
1// RUN: %clang_cc1 %s -triple i686-pc-win32 -std=c++11 -Wmicrosoft -fms-compatibility -verify2// RUN: not %clang_cc1 %s -triple i686-pc-win32 -std=c++11 -Wmicrosoft -fms-compatibility -fdiagnostics-parseable-fixits 2>&1 | FileCheck %s3 4struct X;5namespace name_at_tu_scope {6struct Y {7  friend struct X; // expected-warning-re {{unqualified friend declaration {{.*}} is a Microsoft extension}}8  // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:"::"9};10}11 12namespace enclosing_friend_decl {13struct B;14namespace ns {15struct A {16  friend struct B; // expected-warning-re {{unqualified friend declaration {{.*}} is a Microsoft extension}}17  // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:"enclosing_friend_decl::"18protected:19  A();20};21}22struct B {23  static void f() { ns::A x; }24};25}26 27namespace enclosing_friend_qualified {28struct B;29namespace ns {30struct A {31  friend struct enclosing_friend_qualified::B; // Adding name specifiers fixes it.32protected:33  A();34};35}36struct B {37  static void f() { ns::A x; }38};39}40 41namespace enclosing_friend_no_tag {42struct B;43namespace ns {44struct A {45  friend B; // Removing the tag decl fixes it.46protected:47  A();48};49}50struct B {51  static void f() { ns::A x; }52};53}54 55namespace enclosing_friend_func {56void f();57namespace ns {58struct A {59  // Amusingly, in MSVC, this declares ns::f(), and doesn't find the outer f().60  friend void f();61protected:62  A(); // expected-note {{declared protected here}}63};64}65void f() { ns::A x; } // expected-error {{calling a protected constructor of class 'enclosing_friend_func::ns::A'}}66}67 68namespace test_nns_fixit_hint {69namespace name1 {70namespace name2 {71struct X;72struct name2;73namespace name3 {74struct Y {75  friend struct X; // expected-warning-re {{unqualified friend declaration {{.*}} is a Microsoft extension}}76  // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:"name1::name2::"77};78}79}80}81}82 83// A friend declaration injects a forward declaration into the nearest enclosing84// non-member scope.85namespace friend_as_a_forward_decl {86 87class A {88  class Nested {89    friend class B;90    B *b;91  };92  B *b;93};94B *global_b;95 96void f() {97  class Local {98    friend class Z;99    Z *b;100  };101  Z *b;102}103 104}105