| // 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: |
| } |