Reviewed By: jeremydubreil Differential Revision: D7312430 fbshipit-source-id: 636e31bmaster
parent
8ccf4897dd
commit
9ca945aa2f
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 - present Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace returns {
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
int f_;
|
||||||
|
|
||||||
|
S(int f) : f_(f) {}
|
||||||
|
|
||||||
|
~S() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const int& return_literal_stack_reference_bad() { return 1; }
|
||||||
|
|
||||||
|
const int& return_variable_stack_reference1_bad() {
|
||||||
|
const int& x = 2;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int& return_variable_stack_reference2_bad() {
|
||||||
|
const int& x = 2;
|
||||||
|
const int& y = x;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int return_read_of_stack_reference_ok() {
|
||||||
|
const int& x = 2;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int& return_formal_reference_ok(int& formal) { return formal; }
|
||||||
|
|
||||||
|
const int& return_reference_to_formal_pointer_ok(const int* formal) {
|
||||||
|
const int& local = *formal;
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern const int& callee();
|
||||||
|
|
||||||
|
const int& return_reference_from_callee_ok() {
|
||||||
|
const int& local = callee();
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int return_int_ok() { return 1; }
|
||||||
|
|
||||||
|
const bool return_comparison_temp_ok() { return 1 != 2; }
|
||||||
|
|
||||||
|
const bool compare_local_refs_ok() {
|
||||||
|
const int& local1 = 1;
|
||||||
|
const int& local2 = 1;
|
||||||
|
return local1 != local2;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int& global;
|
||||||
|
|
||||||
|
const int& return_global_reference_ok() { return global; }
|
||||||
|
|
||||||
|
struct MemberReference {
|
||||||
|
int& member1;
|
||||||
|
|
||||||
|
int& return_member_reference_ok() { return member1; }
|
||||||
|
|
||||||
|
int* member2;
|
||||||
|
int* return_member_reference_indirect_ok() {
|
||||||
|
int* local = member2;
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const char* const kOptions;
|
||||||
|
|
||||||
|
const char* return_field_addr_ternary_ok() {
|
||||||
|
const char* const* const t = &kOptions;
|
||||||
|
return t ? *t : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
int* return_stack_pointer_bad() {
|
||||||
|
int x = 3;
|
||||||
|
return &x;
|
||||||
|
}
|
||||||
|
|
||||||
|
S* return_static_local_ok() {
|
||||||
|
S* local;
|
||||||
|
static S s{1};
|
||||||
|
local = &s;
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
|
||||||
|
S* return_static_local_inner_scope_ok(bool b) {
|
||||||
|
S* local = nullptr;
|
||||||
|
if (b) {
|
||||||
|
static S s{1};
|
||||||
|
local = &s;
|
||||||
|
// destructor for s gets called here, but it shouldn't be
|
||||||
|
}
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
|
||||||
|
int* return_formal_pointer_ok(int* formal) { return formal; }
|
||||||
|
|
||||||
|
int* return_deleted_bad() {
|
||||||
|
int* x = new int;
|
||||||
|
*x = 2;
|
||||||
|
delete x;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this *could* be ok depending on what the destructor does, but there's
|
||||||
|
// probably no good reason to do it
|
||||||
|
S* FN_return_destructed_pointer_bad() {
|
||||||
|
S* s = new S(1);
|
||||||
|
s->~S();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* return_nullptr1_ok() { return nullptr; }
|
||||||
|
|
||||||
|
const char* return_nullptr2_ok() {
|
||||||
|
const char* local = nullptr;
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace returns
|
Loading…
Reference in new issue