// RUN: %clang_cc1 -fsyntax-only -Wdangling-field -verify -std=c++11 %s struct X { X(int); }; struct Y { operator X*(); operator X&(); }; struct S { int &x, *y; // expected-note {{reference member declared here}} \ // expected-note {{pointer member declared here}} S(int i) : x(i), // expected-warning {{binding reference member 'x' to stack allocated parameter 'i'}} y(&i) {} // expected-warning {{initializing pointer member 'y' with the stack address of parameter 'i'}} S(int &i) : x(i), y(&i) {} // no-warning: reference parameter S(int *i) : x(*i), y(i) {} // no-warning: pointer parameter }; struct S2 { const X &x; // expected-note {{reference member declared here}} S2(int i) : x(i) {} // expected-error {{member 'x' binds to a temporary}} }; struct S3 { X &x1, *x2; S3(Y y) : x1(y), x2(y) {} // no-warning: conversion operator }; template <typename T> struct S4 { T x; // expected-note {{reference member declared here}} S4(int i) : x(i) {} // expected-warning {{binding reference member 'x' to stack allocated parameter 'i'}} }; template struct S4<int>; // no warning from this instantiation template struct S4<int&>; // expected-note {{in instantiation}} struct S5 { const X &x; // expected-note {{here}} }; S5 s5 = { 0 }; // ok, lifetime-extended struct S6 { S5 s5; // expected-note {{here}} S6() : s5 { 0 } {} // expected-error {{reference subobject of member 's5' binds to a temporary}} }; struct S7 : S5 { S7() : S5 { 0 } {} // expected-error {{reference member 'x' binds to a temporary}} }; struct S8 { int *p; S8(int *a) : p(&a[0]) {} };