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