1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -std=c++11 %s
2 
3 namespace PR26599 {
4 template <typename>
5 struct S;
6 
7 struct I {};
8 
9 template <typename T>
non_pointer()10 void *&non_pointer() {
11   void *&r = S<T>()[I{}];
12   return r;
13 }
14 
15 template <typename T>
pointer()16 void *&pointer() {
17   void *&r = S<T>()[nullptr];
18   return r;
19 }
20 }
21 
22 namespace LocalTemporary {
23 
24 template <class T>
25 class QMap {
26 public:
value(const T & t=T ()) const27   T value(const T &t = T()) const {
28     return t;
29   }
30 };
31 
32 struct A {};
33 
test()34 void test() {
35   QMap<A *> map;
36   map.value();
37 }
38 
39 typedef int* ptr;
int1(const ptr & p=ptr ())40 ptr int1(const ptr &p = ptr()) {
41   return (p);
42 }
43 
int2(const ptr & p=nullptr)44 ptr int2(const ptr &p = nullptr) {
45   return p;
46 }
47 
int3()48 ptr int3() {
49   const ptr &p = ptr();
50   return p;
51 }
52 
int4(const int & x=5)53 const int *int4(const int &x = 5) {
54   return &x;
55 }
56 
int5(const int & x)57 const int *int5(const int &x) {
58   return &x;
59 }
60 
int6()61 const int *int6() {
62   const int &x = 11;  //expected-note{{binding reference variable 'x' here}}
63   return &x;  //expected-warning{{returning address of local temporary object}}
64 }
65 
int7(int x)66 const int *int7(int x) {
67   const int &x2 = x;  // expected-note{{binding reference variable 'x2' here}}
68   return &x2;  //  expected-warning{{address of stack memory associated with parameter 'x' returned}}
69 }
70 
int8(const int & x=5)71 const int *int8(const int &x = 5) {
72   const int &x2 = x;
73   return &x2;
74 }
75 
int9()76 const int *int9() {
77   const int &x = 5;  // expected-note{{binding reference variable 'x' here}}
78   const int &x2 = x;  // expected-note{{binding reference variable 'x2' here}}
79   return &x2;  // expected-warning{{returning address of local temporary object}}
80 }
81 }
82