1 // RUN: not %clang_cc1 -fsyntax-only -std=c++11 %s 2>&1 | FileCheck %s 2 3 struct E { 4 int num; 5 const int Cnum = 0; 6 mutable int Mnum; 7 static int Snum; 8 const static int CSnum; 9 }; 10 11 struct D { 12 E e; 13 const E Ce; 14 mutable E Me; 15 static E Se; 16 const static E CSe; 17 E &getE() const; 18 const E &getCE() const; 19 }; 20 21 struct C { 22 D d; 23 const D Cd; 24 mutable D Md; 25 static D Sd; 26 const static D CSd; 27 D &getD() const; 28 const D &getCD() const; 29 }; 30 31 struct B { 32 C c; 33 const C Cc; 34 mutable C Mc; 35 static C Sc; 36 const static C CSc; 37 C &getC() const; 38 static C &getSC(); 39 const C &getCC() const; 40 static const C &getSCC(); 41 }; 42 43 struct A { 44 B b; 45 const B Cb; 46 mutable B Mb; 47 static B Sb; 48 const static B CSb; 49 B &getB() const; 50 static B &getSB(); 51 const B &getCB() const; 52 static const B &getSCB(); 53 }; 54 55 A& getA(); 56 57 // Valid assignment test1(A a,const A Ca)58void test1(A a, const A Ca) { 59 a.b.c.d.e.num = 5; 60 a.b.c.d.e.Mnum = 5; 61 Ca.b.c.d.e.Mnum = 5; 62 a.b.c.d.e.Snum = 5; 63 Ca.b.c.d.e.Snum = 5; 64 Ca.b.c.Md.e.num = 5; 65 Ca.Mb.Cc.d.e.Mnum = 5; 66 Ca.Mb.getC().d.e.num = 5; 67 Ca.getSB().c.d.e.num = 5; 68 a.getSCB().c.d.Me.num = 5; 69 Ca.Cb.Cc.Cd.Ce.Snum = 5; 70 // CHECK-NOT: error: 71 // CHECK-NOT: note: 72 } 73 74 // One note test2(A a,const A Ca)75void test2(A a, const A Ca) { 76 Ca.b.c.d.e.num = 5; 77 // CHECK-NOT: error: 78 // CHECK: error:{{.*}} 'Ca' 79 // CHECK-NOT: note: 80 // CHECK: note:{{.*}} 'Ca' 81 // CHECK-NOT: note: 82 83 a.Cb.c.d.e.num = 5; 84 // CHECK-NOT: error: 85 // CHECK: error:{{.*}} 'Cb' 86 // CHECK-NOT: note: 87 // CHECK: note:{{.*}} 'Cb' 88 // CHECK-NOT: note: 89 90 a.b.c.Cd.e.num = 5; 91 // CHECK-NOT: error: 92 // CHECK: error:{{.*}} 'Cd' 93 // CHECK-NOT: note: 94 // CHECK: note:{{.*}} 'Cd' 95 // CHECK-NOT: note: 96 97 a.b.c.d.e.CSnum = 5; 98 // CHECK-NOT: error: 99 // CHECK: error:{{.*}} 'CSnum' 100 // CHECK-NOT: note: 101 // CHECK: note:{{.*}} 'CSnum' 102 // CHECK-NOT: note: 103 104 a.b.c.d.e.Cnum = 5; 105 // CHECK-NOT: error: 106 // CHECK: error:{{.*}} 'Cnum' 107 // CHECK-NOT: note: 108 // CHECK: note:{{.*}} 'Cnum' 109 // CHECK-NOT: note: 110 111 a.getCB().c.d.e.num = 5; 112 // CHECK-NOT: error: 113 // CHECK: error:{{.*}} 'getCB' 114 // CHECK-NOT: note: 115 // CHECK: note:{{.*}} 'getCB' 116 // CHECK-NOT: note: 117 118 a.getSCB().c.d.e.num = 5; 119 // CHECK-NOT: error: 120 // CHECK: error:{{.*}} 'getSCB' 121 // CHECK-NOT: note: 122 // CHECK: note:{{.*}} 'getSCB' 123 // CHECK-NOT: note: 124 } 125 126 // Two notes test3(A a,const A Ca)127void test3(A a, const A Ca) { 128 129 a.getSCB().Cc.d.e.num = 5; 130 // CHECK-NOT: error: 131 // CHECK: error:{{.*}} 'Cc' 132 // CHECK-NOT: note: 133 // CHECK: note:{{.*}} 'Cc' 134 // CHECK-NOT: note: 135 // CHECK: note:{{.*}} 'getSCB' 136 // CHECK-NOT: note: 137 138 Ca.b.c.Cd.e.num = 5; 139 // CHECK-NOT: error: 140 // CHECK: error:{{.*}} 'Cd' 141 // CHECK-NOT: note: 142 // CHECK: note:{{.*}} 'Cd' 143 // CHECK-NOT: note: 144 // CHECK: note:{{.*}} 'Ca' 145 // CHECK-NOT: note: 146 147 a.getCB().c.Cd.e.num = 5; 148 // CHECK-NOT: error: 149 // CHECK: error:{{.*}} 'Cd' 150 // CHECK-NOT: note: 151 // CHECK: note:{{.*}} 'Cd' 152 // CHECK-NOT: note: 153 // CHECK: note:{{.*}} 'getCB' 154 // CHECK-NOT: note: 155 156 a.b.getCC().d.e.Cnum = 5; 157 // CHECK-NOT: error: 158 // CHECK: error:{{.*}} 'Cnum' 159 // CHECK-NOT: note: 160 // CHECK: note:{{.*}} 'Cnum' 161 // CHECK-NOT: note: 162 // CHECK: note:{{.*}} 'getCC' 163 // CHECK-NOT: note: 164 165 a.b.c.Cd.Ce.num = 5; 166 // CHECK-NOT: error: 167 // CHECK: error:{{.*}} 'Ce' 168 // CHECK-NOT: note: 169 // CHECK: note:{{.*}} 'Ce' 170 // CHECK-NOT: note: 171 // CHECK: note:{{.*}} 'Cd' 172 // CHECK-NOT: note: 173 174 a.b.CSc.Cd.e.num = 5; 175 // CHECK-NOT: error: 176 // CHECK: error:{{.*}} 'Cd' 177 // CHECK-NOT: note: 178 // CHECK: note:{{.*}} 'Cd' 179 // CHECK-NOT: note: 180 // CHECK: note:{{.*}} 'CSc' 181 // CHECK-NOT: note: 182 183 a.CSb.c.Cd.e.num = 5; 184 // CHECK-NOT: error: 185 // CHECK: error:{{.*}} 'Cd' 186 // CHECK-NOT: note: 187 // CHECK: note:{{.*}} 'Cd' 188 // CHECK-NOT: note: 189 // CHECK: note:{{.*}} 'CSb' 190 // CHECK-NOT: note: 191 } 192 193 // No errors test4(const A Ca)194void test4(const A Ca) { 195 // Mutable cases 196 Ca.Mb.c.d.e.num = 5; 197 Ca.CSb.Mc.d.e.num = 5; 198 Ca.getCB().Mc.d.e.num = 5; 199 Ca.getSCB().Mc.d.e.num = 5; 200 201 // Returning non-const reference 202 Ca.getB().c.d.e.num = 5; 203 Ca.CSb.getC().d.e.num = 5; 204 Ca.getCB().getC().d.e.num = 5; 205 Ca.getSCB().getC().d.e.num = 5; 206 207 // Returning non-const reference 208 Ca.getSB().c.d.e.num = 5; 209 Ca.CSb.getSC().d.e.num = 5; 210 Ca.getCB().getSC().d.e.num = 5; 211 Ca.getSCB().getSC().d.e.num = 5; 212 213 // Static member 214 Ca.Sb.c.d.e.num = 5; 215 Ca.CSb.Sc.d.e.num = 5; 216 Ca.getCB().Sc.d.e.num = 5; 217 Ca.getSCB().Sc.d.e.num = 5; 218 219 // CHECK-NOT: error: 220 // CHECK-NOT: note: 221 } 222 223 // Only display notes for relavent cases. test5(const A Ca)224void test5(const A Ca) { 225 Ca.Mb.c.d.Ce.num = 5; 226 // CHECK-NOT: error: 227 // CHECK: error:{{.*}} 'Ce' 228 // CHECK-NOT: note: 229 // CHECK: note:{{.*}} 'Ce' 230 // CHECK-NOT: note: 231 232 Ca.getB().c.d.Ce.num = 5; 233 // CHECK-NOT: error: 234 // CHECK: error:{{.*}} 'Ce' 235 // CHECK-NOT: note: 236 // CHECK: note:{{.*}} 'Ce' 237 // CHECK-NOT: note: 238 239 Ca.getSB().c.d.Ce.num = 5; 240 // CHECK-NOT: error: 241 // CHECK: error:{{.*}} 'Ce' 242 // CHECK-NOT: note: 243 // CHECK: note:{{.*}} 'Ce' 244 // CHECK-NOT: note: 245 246 Ca.Sb.c.d.Ce.num = 5; 247 // CHECK-NOT: error: 248 // CHECK: error:{{.*}} 'Ce' 249 // CHECK-NOT: note: 250 // CHECK: note:{{.*}} 'Ce' 251 // CHECK-NOT: note: 252 } 253