/* { dg-require-effective-target label_values } */

/* As a quality of implementation issue, we should not prevent inlining
   of function explicitly marked inline just because a label therein had
   its address taken.  */

void abort(void);
void exit(int);

static void *ptr1, *ptr2;
static int i = 1;

static __inline__ void doit(void **pptr, int cond) {
    if (cond) {
    here:
        *pptr = &&here;
    }
}

__attribute__((noinline)) static void f(int cond) {
    doit(&ptr1, cond);
}

__attribute__((noinline)) static void g(int cond) {
    doit(&ptr2, cond);
}

__attribute__((noinline)) static void bar(void);

int main() {
    f(i);
    bar();
    g(i);

#if __OPTIMIZE__ >= 2
    if (ptr1 == ptr2)
        abort();
#endif

    exit(0);
}

void bar(void) {}
