| // 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]) {} |
| }; |