1 // RUN: %clang_cc1 -fsyntax-only -verify %s
5 return &x; // expected-warning {{address of stack memory}}
8 int* ret_local_array() {
10 return x; // expected-warning {{address of stack memory}}
13 int* ret_local_array_element(int i) {
15 return &x[i]; // expected-warning {{address of stack memory}}
18 int *ret_local_array_element_reversed(int i) {
20 return &i[x]; // expected-warning {{address of stack memory}}
23 int* ret_local_array_element_const_index() {
25 return &x[2]; // expected-warning {{address of stack memory}}
28 int& ret_local_ref() {
30 return x; // expected-warning {{reference to stack memory}}
33 int* ret_local_addrOf() {
35 return &*&x; // expected-warning {{address of stack memory}}
38 int* ret_local_addrOf_paren() {
40 return (&(*(&x))); // expected-warning {{address of stack memory}}
43 int* ret_local_addrOf_ptr_arith() {
45 return &*(&x+1); // expected-warning {{address of stack memory}}
48 int* ret_local_addrOf_ptr_arith2() {
50 return &*(&x+1); // expected-warning {{address of stack memory}}
53 int* ret_local_field() {
55 return &a.x; // expected-warning {{address of stack memory}}
58 int& ret_local_field_ref() {
60 return a.x; // expected-warning {{reference to stack memory}}
63 int* ret_conditional(bool cond) {
66 return cond ? &x : &y; // expected-warning {{address of stack memory}}
69 int* ret_conditional_rhs(int *x, bool cond) {
71 return cond ? x : &y; // expected-warning {{address of stack memory}}
76 return (void*) &x; // expected-warning {{address of stack memory}}
79 int* ret_static_var() {
81 return &x; // no warning.
87 return &z; // no warning.
90 int* ret_parameter(int x) {
91 return &x; // expected-warning {{address of stack memory}}
95 void* ret_cpp_static_cast(short x) {
96 return static_cast<void*>(&x); // expected-warning {{address of stack memory}}
99 int* ret_cpp_reinterpret_cast(double x) {
100 return reinterpret_cast<int*>(&x); // expected-warning {{address of stack me}}
103 int* ret_cpp_reinterpret_cast_no_warning(long x) {
104 return reinterpret_cast<int*>(x); // no-warning
107 int* ret_cpp_const_cast(const int x) {
108 return const_cast<int*>(&x); // expected-warning {{address of stack memory}}
111 // PR 7999 - handle the case where a field is itself a reference.
112 template <typename T> struct PR7999 {
113 PR7999(T& t) : value(t) {}
119 PR7999_X& PR7999_f(PR7999<PR7999_X> s) { return s.value; } // no-warning
120 void test_PR7999(PR7999_X& x) { (void)PR7999_f(x); } // no-warning
122 // PR 8774: Don't try to evaluate parameters with default arguments like
123 // variables with an initializer, especially in templates where the default
124 // argument may not be an expression (yet).
126 template <typename U> struct B { };
127 template <typename V> V f(typename B<V>::type const &v = B<V>::value()) {
130 template <> struct B<const char *> {
131 typedef const char *type;
132 static const char *value();
140 // TODO: test case for dynamic_cast. clang does not yet have
141 // support for C++ classes to write such a test case.