reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
// RUN: %clang_cc1 -fsyntax-only -verify %s

void escapefunc(int *);
void noescapefunc(__attribute__((noescape)) int *);
void (*escapefuncptr)(int *);
void (*noescapefuncptr)(__attribute__((noescape)) int *);

void func_ne(__attribute__((noescape)) int *, int *);
void func_en(int *, __attribute__((noescape)) int *);

void (*funcptr_ee)(int *, int *);
void (*funcptr_nn)(__attribute__((noescape)) int *, __attribute__((noescape)) int *);

void test0(int c) {
  escapefuncptr = &escapefunc;
  escapefuncptr = &noescapefunc;
  noescapefuncptr = &escapefunc; // expected-warning {{incompatible function pointer types assigning to 'void (*)(__attribute__((noescape)) int *)' from 'void (*)(int *)'}}
  noescapefuncptr = &noescapefunc;

  escapefuncptr = c ? &escapefunc : &noescapefunc;
  noescapefuncptr = c ? &escapefunc : &noescapefunc; // expected-warning {{incompatible function pointer types assigning to 'void (*)(__attribute__((noescape)) int *)' from 'void (*)(int *)'}}

  funcptr_ee = c ? &func_ne : &func_en;
  funcptr_nn = c ? &func_ne : &func_en; // expected-warning {{incompatible function pointer types assigning to 'void (*)(__attribute__((noescape)) int *, __attribute__((noescape)) int *)' from 'void (*)(int *, int *)'}}
}