1cfd4553aSSaleem Abdulrasool // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -std=c++11 %s
2cfd4553aSSaleem Abdulrasool 
3cfd4553aSSaleem Abdulrasool namespace PR26599 {
4cfd4553aSSaleem Abdulrasool template <typename>
5cfd4553aSSaleem Abdulrasool struct S;
6cfd4553aSSaleem Abdulrasool 
7cfd4553aSSaleem Abdulrasool struct I {};
8cfd4553aSSaleem Abdulrasool 
9cfd4553aSSaleem Abdulrasool template <typename T>
non_pointer()10cfd4553aSSaleem Abdulrasool void *&non_pointer() {
11cfd4553aSSaleem Abdulrasool   void *&r = S<T>()[I{}];
12cfd4553aSSaleem Abdulrasool   return r;
13cfd4553aSSaleem Abdulrasool }
14cfd4553aSSaleem Abdulrasool 
15cfd4553aSSaleem Abdulrasool template <typename T>
pointer()16cfd4553aSSaleem Abdulrasool void *&pointer() {
17cfd4553aSSaleem Abdulrasool   void *&r = S<T>()[nullptr];
18cfd4553aSSaleem Abdulrasool   return r;
19cfd4553aSSaleem Abdulrasool }
20cfd4553aSSaleem Abdulrasool }
21cfd4553aSSaleem Abdulrasool 
2281b6c561SRichard Trieu namespace LocalTemporary {
2381b6c561SRichard Trieu 
2481b6c561SRichard Trieu template <class T>
2581b6c561SRichard Trieu class QMap {
2681b6c561SRichard Trieu public:
value(const T & t=T ()) const2781b6c561SRichard Trieu   T value(const T &t = T()) const {
2881b6c561SRichard Trieu     return t;
2981b6c561SRichard Trieu   }
3081b6c561SRichard Trieu };
3181b6c561SRichard Trieu 
3281b6c561SRichard Trieu struct A {};
3381b6c561SRichard Trieu 
test()3481b6c561SRichard Trieu void test() {
3581b6c561SRichard Trieu   QMap<A *> map;
3681b6c561SRichard Trieu   map.value();
3781b6c561SRichard Trieu }
3881b6c561SRichard Trieu 
3981b6c561SRichard Trieu typedef int* ptr;
int1(const ptr & p=ptr ())4081b6c561SRichard Trieu ptr int1(const ptr &p = ptr()) {
4181b6c561SRichard Trieu   return (p);
4281b6c561SRichard Trieu }
4381b6c561SRichard Trieu 
int2(const ptr & p=nullptr)4481b6c561SRichard Trieu ptr int2(const ptr &p = nullptr) {
4581b6c561SRichard Trieu   return p;
4681b6c561SRichard Trieu }
4781b6c561SRichard Trieu 
int3()4881b6c561SRichard Trieu ptr int3() {
4981b6c561SRichard Trieu   const ptr &p = ptr();
5081b6c561SRichard Trieu   return p;
5181b6c561SRichard Trieu }
5281b6c561SRichard Trieu 
int4(const int & x=5)5381b6c561SRichard Trieu const int *int4(const int &x = 5) {
5481b6c561SRichard Trieu   return &x;
5581b6c561SRichard Trieu }
5681b6c561SRichard Trieu 
int5(const int & x)5781b6c561SRichard Trieu const int *int5(const int &x) {
5881b6c561SRichard Trieu   return &x;
5981b6c561SRichard Trieu }
6081b6c561SRichard Trieu 
int6()6181b6c561SRichard Trieu const int *int6() {
6281b6c561SRichard Trieu   const int &x = 11;  //expected-note{{binding reference variable 'x' here}}
6381b6c561SRichard Trieu   return &x;  //expected-warning{{returning address of local temporary object}}
6481b6c561SRichard Trieu }
6581b6c561SRichard Trieu 
int7(int x)6681b6c561SRichard Trieu const int *int7(int x) {
6781b6c561SRichard Trieu   const int &x2 = x;  // expected-note{{binding reference variable 'x2' here}}
68*afe48f9dSRichard Smith   return &x2;  //  expected-warning{{address of stack memory associated with parameter 'x' returned}}
6981b6c561SRichard Trieu }
7081b6c561SRichard Trieu 
int8(const int & x=5)7181b6c561SRichard Trieu const int *int8(const int &x = 5) {
7281b6c561SRichard Trieu   const int &x2 = x;
7381b6c561SRichard Trieu   return &x2;
7481b6c561SRichard Trieu }
7581b6c561SRichard Trieu 
int9()7681b6c561SRichard Trieu const int *int9() {
7781b6c561SRichard Trieu   const int &x = 5;  // expected-note{{binding reference variable 'x' here}}
7881b6c561SRichard Trieu   const int &x2 = x;  // expected-note{{binding reference variable 'x2' here}}
7981b6c561SRichard Trieu   return &x2;  // expected-warning{{returning address of local temporary object}}
8081b6c561SRichard Trieu }
8181b6c561SRichard Trieu }
82