// RUN: not %clang_cc1 -fsyntax-only -std=c++11 %s 2>&1 | FileCheck %s struct E { int num; const int Cnum = 0; mutable int Mnum; static int Snum; const static int CSnum; }; struct D { E e; const E Ce; mutable E Me; static E Se; const static E CSe; E &getE() const; const E &getCE() const; }; struct C { D d; const D Cd; mutable D Md; static D Sd; const static D CSd; D &getD() const; const D &getCD() const; }; struct B { C c; const C Cc; mutable C Mc; static C Sc; const static C CSc; C &getC() const; static C &getSC(); const C &getCC() const; static const C &getSCC(); }; struct A { B b; const B Cb; mutable B Mb; static B Sb; const static B CSb; B &getB() const; static B &getSB(); const B &getCB() const; static const B &getSCB(); }; A& getA(); // Valid assignment void test1(A a, const A Ca) { a.b.c.d.e.num = 5; a.b.c.d.e.Mnum = 5; Ca.b.c.d.e.Mnum = 5; a.b.c.d.e.Snum = 5; Ca.b.c.d.e.Snum = 5; Ca.b.c.Md.e.num = 5; Ca.Mb.Cc.d.e.Mnum = 5; Ca.Mb.getC().d.e.num = 5; Ca.getSB().c.d.e.num = 5; a.getSCB().c.d.Me.num = 5; Ca.Cb.Cc.Cd.Ce.Snum = 5; // CHECK-NOT: error: // CHECK-NOT: note: } // One note void test2(A a, const A Ca) { Ca.b.c.d.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Ca' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ca' // CHECK-NOT: note: a.Cb.c.d.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cb' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cb' // CHECK-NOT: note: a.b.c.Cd.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cd' // CHECK-NOT: note: a.b.c.d.e.CSnum = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'CSnum' // CHECK-NOT: note: // CHECK: note:{{.*}} 'CSnum' // CHECK-NOT: note: a.b.c.d.e.Cnum = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cnum' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cnum' // CHECK-NOT: note: a.getCB().c.d.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'getCB' // CHECK-NOT: note: // CHECK: note:{{.*}} 'getCB' // CHECK-NOT: note: a.getSCB().c.d.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'getSCB' // CHECK-NOT: note: // CHECK: note:{{.*}} 'getSCB' // CHECK-NOT: note: } // Two notes void test3(A a, const A Ca) { a.getSCB().Cc.d.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cc' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cc' // CHECK-NOT: note: // CHECK: note:{{.*}} 'getSCB' // CHECK-NOT: note: Ca.b.c.Cd.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ca' // CHECK-NOT: note: a.getCB().c.Cd.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'getCB' // CHECK-NOT: note: a.b.getCC().d.e.Cnum = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cnum' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cnum' // CHECK-NOT: note: // CHECK: note:{{.*}} 'getCC' // CHECK-NOT: note: a.b.c.Cd.Ce.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Ce' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ce' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cd' // CHECK-NOT: note: a.b.CSc.Cd.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'CSc' // CHECK-NOT: note: a.CSb.c.Cd.e.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Cd' // CHECK-NOT: note: // CHECK: note:{{.*}} 'CSb' // CHECK-NOT: note: } // No errors void test4(const A Ca) { // Mutable cases Ca.Mb.c.d.e.num = 5; Ca.CSb.Mc.d.e.num = 5; Ca.getCB().Mc.d.e.num = 5; Ca.getSCB().Mc.d.e.num = 5; // Returning non-const reference Ca.getB().c.d.e.num = 5; Ca.CSb.getC().d.e.num = 5; Ca.getCB().getC().d.e.num = 5; Ca.getSCB().getC().d.e.num = 5; // Returning non-const reference Ca.getSB().c.d.e.num = 5; Ca.CSb.getSC().d.e.num = 5; Ca.getCB().getSC().d.e.num = 5; Ca.getSCB().getSC().d.e.num = 5; // Static member Ca.Sb.c.d.e.num = 5; Ca.CSb.Sc.d.e.num = 5; Ca.getCB().Sc.d.e.num = 5; Ca.getSCB().Sc.d.e.num = 5; // CHECK-NOT: error: // CHECK-NOT: note: } // Only display notes for relevant cases. void test5(const A Ca) { Ca.Mb.c.d.Ce.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Ce' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ce' // CHECK-NOT: note: Ca.getB().c.d.Ce.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Ce' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ce' // CHECK-NOT: note: Ca.getSB().c.d.Ce.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Ce' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ce' // CHECK-NOT: note: Ca.Sb.c.d.Ce.num = 5; // CHECK-NOT: error: // CHECK: error:{{.*}} 'Ce' // CHECK-NOT: note: // CHECK: note:{{.*}} 'Ce' // CHECK-NOT: note: }