xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-dangling-field.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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