@@ -596,10 +596,10 @@ const int* return_pointer_to_parameter_via_reference(int a, int b, bool cond) {
596596 const int * d = &c;
597597 return d; // expected-note 2 {{returned here}}
598598}
599- // FIXME: Dereference of a pointer does not track the reference.
599+
600600const int & return_pointer_to_parameter_via_reference_1 (int a) {
601- const int * d = &a;
602- return *d;
601+ const int * d = &a; // expected-warning {{address of stack memory is returned later}}
602+ return *d; // expected-note {{returned here}}
603603}
604604
605605const int & get_ref_to_local () {
@@ -1118,24 +1118,24 @@ struct MyObjStorage {
11181118 const MyObj *end () const { return objs + 1 ; }
11191119};
11201120
1121- // FIXME: Detect use-after-scope. Dereference pointer does not propagate the origins.
11221121void range_based_for_use_after_scope () {
11231122 View v;
11241123 {
11251124 MyObjStorage s;
1126- for (const MyObj &o : s) {
1125+ for (const MyObj &o : s) { // expected-warning {{object whose reference is captured does not live long enough}}
11271126 v = o;
11281127 }
1129- }
1130- v.use ();
1128+ } // expected-note {{destroyed here}}
1129+ v.use (); // expected-note {{later used here}}
11311130}
1132- // FIXME: Detect use-after-return. Dereference pointer does not propagate the origins.
1131+
11331132View range_based_for_use_after_return () {
11341133 MyObjStorage s;
1135- for (const MyObj &o : s) {
1136- return o;
1134+ for (const MyObj &o : s) { // expected-warning {{address of stack memory is returned later}}
1135+ return o; // expected-note {{returned here}}
11371136 }
1138- return *s.begin ();
1137+ return *s.begin (); // expected-warning {{address of stack memory is returned later}}
1138+ // expected-note@-1 {{returned here}}
11391139}
11401140
11411141void range_based_for_not_reference () {
0 commit comments