xref: /aosp_15_r20/external/clang/test/SemaCXX/address-of.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // PR clang/3175
3*67e74705SXin Li 
4*67e74705SXin Li void bar(int*);
5*67e74705SXin Li 
6*67e74705SXin Li class c {
7*67e74705SXin Li   int var;
8*67e74705SXin Li   static int svar;
foo()9*67e74705SXin Li   void foo() {
10*67e74705SXin Li     bar(&var);
11*67e74705SXin Li     bar(&svar);
12*67e74705SXin Li   }
13*67e74705SXin Li 
wibble()14*67e74705SXin Li   static void wibble() {
15*67e74705SXin Li     bar(&var); // expected-error{{invalid use of member 'var' in static member function}}
16*67e74705SXin Li     bar(&svar);
17*67e74705SXin Li   }
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li enum E {
21*67e74705SXin Li   Enumerator
22*67e74705SXin Li };
23*67e74705SXin Li 
test()24*67e74705SXin Li void test() {
25*67e74705SXin Li   (void)&Enumerator; // expected-error{{cannot take the address of an rvalue of type 'E'}}
26*67e74705SXin Li }
27*67e74705SXin Li 
28*67e74705SXin Li template<int N>
test2()29*67e74705SXin Li void test2() {
30*67e74705SXin Li   (void)&N; // expected-error{{cannot take the address of an rvalue of type 'int'}}
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li // PR clang/3222
34*67e74705SXin Li void xpto();
35*67e74705SXin Li void (*xyz)(void) = &xpto;
36*67e74705SXin Li 
37*67e74705SXin Li struct PR11066 {
38*67e74705SXin Li   static int foo(short);
39*67e74705SXin Li   static int foo(float);
40*67e74705SXin Li   void test();
41*67e74705SXin Li };
42*67e74705SXin Li 
test()43*67e74705SXin Li void PR11066::test() {
44*67e74705SXin Li   int (PR11066::*ptr)(int) = & &PR11066::foo; // expected-error{{extra '&' taking address of overloaded function}}
45*67e74705SXin Li }
46*67e74705SXin Li 
47*67e74705SXin Li namespace test3 {
48*67e74705SXin Li   // emit no error
49*67e74705SXin Li   template<typename T> struct S {
50*67e74705SXin Li     virtual void f() = 0;
51*67e74705SXin Li   };
f()52*67e74705SXin Li   template<typename T> void S<T>::f() { T::error; }
53*67e74705SXin Li   void (S<int>::*p)() = &S<int>::f;
54*67e74705SXin Li }
55