1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -Wdangling-field -verify -std=c++11 %s 2*67e74705SXin Li 3*67e74705SXin Li struct X { 4*67e74705SXin Li X(int); 5*67e74705SXin Li }; 6*67e74705SXin Li struct Y { 7*67e74705SXin Li operator X*(); 8*67e74705SXin Li operator X&(); 9*67e74705SXin Li }; 10*67e74705SXin Li 11*67e74705SXin Li struct S { 12*67e74705SXin Li int &x, *y; // expected-note {{reference member declared here}} \ 13*67e74705SXin Li // expected-note {{pointer member declared here}} SS14*67e74705SXin Li S(int i) 15*67e74705SXin Li : x(i), // expected-warning {{binding reference member 'x' to stack allocated parameter 'i'}} 16*67e74705SXin Li y(&i) {} // expected-warning {{initializing pointer member 'y' with the stack address of parameter 'i'}} SS17*67e74705SXin Li S(int &i) : x(i), y(&i) {} // no-warning: reference parameter SS18*67e74705SXin Li S(int *i) : x(*i), y(i) {} // no-warning: pointer parameter 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li struct S2 { 22*67e74705SXin Li const X &x; // expected-note {{reference member declared here}} S2S223*67e74705SXin Li S2(int i) : x(i) {} // expected-warning {{binding reference member 'x' to a temporary}} 24*67e74705SXin Li }; 25*67e74705SXin Li 26*67e74705SXin Li struct S3 { 27*67e74705SXin Li X &x1, *x2; S3S328*67e74705SXin Li S3(Y y) : x1(y), x2(y) {} // no-warning: conversion operator 29*67e74705SXin Li }; 30*67e74705SXin Li 31*67e74705SXin Li template <typename T> struct S4 { 32*67e74705SXin Li T x; // expected-note {{reference member declared here}} S4S433*67e74705SXin Li S4(int i) : x(i) {} // expected-warning {{binding reference member 'x' to stack allocated parameter 'i'}} 34*67e74705SXin Li }; 35*67e74705SXin Li 36*67e74705SXin Li template struct S4<int>; // no warning from this instantiation 37*67e74705SXin Li template struct S4<int&>; // expected-note {{in instantiation}} 38*67e74705SXin Li 39*67e74705SXin Li struct S5 { 40*67e74705SXin Li const X &x; // expected-note {{here}} 41*67e74705SXin Li }; 42*67e74705SXin Li S5 s5 = { 0 }; // ok, lifetime-extended 43*67e74705SXin Li 44*67e74705SXin Li struct S6 { 45*67e74705SXin Li S5 s5; // expected-note {{here}} S6S646*67e74705SXin Li S6() : s5 { 0 } {} // expected-warning {{binding reference subobject of member 's5' to a temporary}} 47*67e74705SXin Li }; 48*67e74705SXin Li 49*67e74705SXin Li struct S7 : S5 { S7S750*67e74705SXin Li S7() : S5 { 0 } {} // expected-warning {{binding reference member 'x' to a temporary}} 51*67e74705SXin Li }; 52