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 Abdulrasoolvoid *&non_pointer() { 11cfd4553aSSaleem Abdulrasool void *&r = S<T>()[I{}]; 12cfd4553aSSaleem Abdulrasool return r; 13cfd4553aSSaleem Abdulrasool } 14cfd4553aSSaleem Abdulrasool 15cfd4553aSSaleem Abdulrasool template <typename T> pointer()16cfd4553aSSaleem Abdulrasoolvoid *&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 Trieuvoid 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 Trieuptr int1(const ptr &p = ptr()) { 4181b6c561SRichard Trieu return (p); 4281b6c561SRichard Trieu } 4381b6c561SRichard Trieu int2(const ptr & p=nullptr)4481b6c561SRichard Trieuptr int2(const ptr &p = nullptr) { 4581b6c561SRichard Trieu return p; 4681b6c561SRichard Trieu } 4781b6c561SRichard Trieu int3()4881b6c561SRichard Trieuptr int3() { 4981b6c561SRichard Trieu const ptr &p = ptr(); 5081b6c561SRichard Trieu return p; 5181b6c561SRichard Trieu } 5281b6c561SRichard Trieu int4(const int & x=5)5381b6c561SRichard Trieuconst int *int4(const int &x = 5) { 5481b6c561SRichard Trieu return &x; 5581b6c561SRichard Trieu } 5681b6c561SRichard Trieu int5(const int & x)5781b6c561SRichard Trieuconst int *int5(const int &x) { 5881b6c561SRichard Trieu return &x; 5981b6c561SRichard Trieu } 6081b6c561SRichard Trieu int6()6181b6c561SRichard Trieuconst 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 Trieuconst 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 Trieuconst int *int8(const int &x = 5) { 7281b6c561SRichard Trieu const int &x2 = x; 7381b6c561SRichard Trieu return &x2; 7481b6c561SRichard Trieu } 7581b6c561SRichard Trieu int9()7681b6c561SRichard Trieuconst 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