head	1.1;
branch	1.1.1;
access;
symbols
	netbsd-11-0-RC6:1.1.1.2
	netbsd-11-0-RC5:1.1.1.2
	netbsd-11-0-RC4:1.1.1.2
	netbsd-11-0-RC3:1.1.1.2
	netbsd-11-0-RC2:1.1.1.2
	netbsd-11-0-RC1:1.1.1.2
	perseant-exfatfs-base-20250801:1.1.1.2
	netbsd-11:1.1.1.2.0.10
	netbsd-11-base:1.1.1.2
	netbsd-10-1-RELEASE:1.1.1.2
	perseant-exfatfs-base-20240630:1.1.1.2
	perseant-exfatfs:1.1.1.2.0.8
	perseant-exfatfs-base:1.1.1.2
	netbsd-8-3-RELEASE:1.1.1.1
	netbsd-9-4-RELEASE:1.1.1.1
	netbsd-10-0-RELEASE:1.1.1.2
	netbsd-10-0-RC6:1.1.1.2
	netbsd-10-0-RC5:1.1.1.2
	netbsd-10-0-RC4:1.1.1.2
	netbsd-10-0-RC3:1.1.1.2
	netbsd-10-0-RC2:1.1.1.2
	netbsd-10-0-RC1:1.1.1.2
	netbsd-10:1.1.1.2.0.6
	netbsd-10-base:1.1.1.2
	netbsd-9-3-RELEASE:1.1.1.1
	cjep_sun2x:1.1.1.2.0.4
	cjep_sun2x-base:1.1.1.2
	cjep_staticlib_x-base1:1.1.1.2
	netbsd-9-2-RELEASE:1.1.1.1
	cjep_staticlib_x:1.1.1.2.0.2
	cjep_staticlib_x-base:1.1.1.2
	netbsd-9-1-RELEASE:1.1.1.1
	phil-wifi-20200421:1.1.1.2
	phil-wifi-20200411:1.1.1.2
	phil-wifi-20200406:1.1.1.2
	netbsd-8-2-RELEASE:1.1.1.1
	netbsd-9-0-RELEASE:1.1.1.1
	netbsd-9-0-RC2:1.1.1.1
	netbsd-9-0-RC1:1.1.1.1
	netbsd-9:1.1.1.1.0.18
	netbsd-9-base:1.1.1.1
	phil-wifi-20190609:1.1.1.1
	netbsd-8-1-RELEASE:1.1.1.1
	netbsd-8-1-RC1:1.1.1.1
	pgoyette-compat-merge-20190127:1.1.1.1
	pgoyette-compat-20190127:1.1.1.1
	pgoyette-compat-20190118:1.1.1.1
	pgoyette-compat-1226:1.1.1.1
	pgoyette-compat-1126:1.1.1.1
	pgoyette-compat-1020:1.1.1.1
	pgoyette-compat-0930:1.1.1.1
	pgoyette-compat-0906:1.1.1.1
	pgoyette-compat-0728:1.1.1.1
	clang-337282:1.1.1.1
	netbsd-8-0-RELEASE:1.1.1.1
	phil-wifi:1.1.1.1.0.16
	phil-wifi-base:1.1.1.1
	pgoyette-compat-0625:1.1.1.1
	netbsd-8-0-RC2:1.1.1.1
	pgoyette-compat-0521:1.1.1.1
	pgoyette-compat-0502:1.1.1.1
	pgoyette-compat-0422:1.1.1.1
	netbsd-8-0-RC1:1.1.1.1
	pgoyette-compat-0415:1.1.1.1
	pgoyette-compat-0407:1.1.1.1
	pgoyette-compat-0330:1.1.1.1
	pgoyette-compat-0322:1.1.1.1
	pgoyette-compat-0315:1.1.1.1
	pgoyette-compat:1.1.1.1.0.14
	pgoyette-compat-base:1.1.1.1
	clang-319952:1.1.1.1
	matt-nb8-mediatek:1.1.1.1.0.12
	matt-nb8-mediatek-base:1.1.1.1
	clang-309604:1.1.1.1
	perseant-stdc-iso10646:1.1.1.1.0.10
	perseant-stdc-iso10646-base:1.1.1.1
	netbsd-8:1.1.1.1.0.8
	netbsd-8-base:1.1.1.1
	prg-localcount2-base3:1.1.1.1
	prg-localcount2-base2:1.1.1.1
	prg-localcount2-base1:1.1.1.1
	prg-localcount2:1.1.1.1.0.6
	prg-localcount2-base:1.1.1.1
	pgoyette-localcount-20170426:1.1.1.1
	bouyer-socketcan-base1:1.1.1.1
	pgoyette-localcount:1.1.1.1.0.4
	pgoyette-localcount-20170320:1.1.1.1
	clang-294123:1.1.1.1
	bouyer-socketcan:1.1.1.1.0.2
	bouyer-socketcan-base:1.1.1.1
	clang-291444:1.1.1.1
	LLVM:1.1.1;
locks; strict;
comment	@// @;


1.1
date	2017.01.11.10.37.40;	author joerg;	state Exp;
branches
	1.1.1.1;
next	;
commitid	CNnUNfII1jgNmxBz;

1.1.1.1
date	2017.01.11.10.37.40;	author joerg;	state Exp;
branches
	1.1.1.1.4.1
	1.1.1.1.16.1;
next	1.1.1.2;
commitid	CNnUNfII1jgNmxBz;

1.1.1.2
date	2019.11.13.22.22.56;	author joerg;	state dead;
branches;
next	;
commitid	QD8YATxuNG34YJKB;

1.1.1.1.4.1
date	2017.01.11.10.37.40;	author pgoyette;	state dead;
branches;
next	1.1.1.1.4.2;
commitid	jjw7cAwgyKq7RfKz;

1.1.1.1.4.2
date	2017.03.20.06.53.34;	author pgoyette;	state Exp;
branches;
next	;
commitid	jjw7cAwgyKq7RfKz;

1.1.1.1.16.1
date	2020.04.13.07.50.23;	author martin;	state dead;
branches;
next	;
commitid	X01YhRUPVUDaec4C;


desc
@@


1.1
log
@Initial revision
@
text
@// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++14

namespace access_control {
class Private {
  void check(int *) __attribute__((enable_if(false, "")));
  void check(double *) __attribute__((enable_if(true, "")));

  static void checkStatic(int *) __attribute__((enable_if(false, "")));
  static void checkStatic(double *) __attribute__((enable_if(true, "")));
};

auto Priv = reinterpret_cast<void (Private::*)(char *)>(&Private::check); // expected-error{{'check' is a private member of 'access_control::Private'}} expected-note@@6{{implicitly declared private here}}

auto PrivStatic = reinterpret_cast<void (*)(char *)>(&Private::checkStatic); // expected-error{{'checkStatic' is a private member of 'access_control::Private'}} expected-note@@9{{implicitly declared private here}}

class Protected {
protected:
  void check(int *) __attribute__((enable_if(false, "")));
  void check(double *) __attribute__((enable_if(true, "")));

  static void checkStatic(int *) __attribute__((enable_if(false, "")));
  static void checkStatic(double *) __attribute__((enable_if(true, "")));
};

auto Prot = reinterpret_cast<void (Protected::*)(char *)>(&Protected::check); // expected-error{{'check' is a protected member of 'access_control::Protected'}} expected-note@@19{{declared protected here}}

auto ProtStatic = reinterpret_cast<void (*)(char *)>(&Protected::checkStatic); // expected-error{{'checkStatic' is a protected member of 'access_control::Protected'}} expected-note@@22{{declared protected here}}
}

namespace unavailable {
// Ensure that we check that the function can be called
void foo() __attribute__((unavailable("don't call this")));
void foo(int) __attribute__((enable_if(false, "")));

void *Ptr = reinterpret_cast<void*>(foo); // expected-error{{'foo' is unavailable: don't call this}} expected-note@@-3{{explicitly marked unavailable here}}
}

namespace template_deduction {
void foo() __attribute__((enable_if(false, "")));

void bar() __attribute__((enable_if(true, "")));
void bar() __attribute__((enable_if(false, "")));

void baz(int a) __attribute__((enable_if(true, "")));
void baz(int a) __attribute__((enable_if(a, "")));
void baz(int a) __attribute__((enable_if(false, "")));

void qux(int a) __attribute__((enable_if(1, "")));
void qux(int a) __attribute__((enable_if(true, "")));
void qux(int a) __attribute__((enable_if(a, "")));
void qux(int a) __attribute__((enable_if(false, "")));

template <typename Fn, typename... Args> void call(Fn F, Args... As) {
  F(As...);
}

void test() {
  call(foo); // expected-error{{cannot take address of function 'foo'}}
  call(bar);
  call(baz, 0);
  call(qux, 0); // expected-error{{no matching function for call to 'call'}} expected-note@@53{{candidate template ignored: couldn't infer template argument 'Fn'}}

  auto Ptr1 = foo; // expected-error{{cannot take address of function 'foo'}}
  auto Ptr2 = bar;
  auto Ptr3 = baz;
  auto Ptr4 = qux; // expected-error{{variable 'Ptr4' with type 'auto' has incompatible initializer of type '<overloaded function type>'}}
}

template <typename Fn, typename T, typename... Args>
void callMem(Fn F, T t, Args... As) {
  (t.*F)(As...);
}

class Foo {
  void bar() __attribute__((enable_if(true, "")));
  void bar() __attribute__((enable_if(false, "")));

  static void staticBar() __attribute__((enable_if(true, "")));
  static void staticBar() __attribute__((enable_if(false, "")));
};

void testAccess() {
  callMem(&Foo::bar, Foo()); // expected-error{{'bar' is a private member of 'template_deduction::Foo'}} expected-note@@-8{{implicitly declared private here}}
  call(&Foo::staticBar); // expected-error{{'staticBar' is a private member of 'template_deduction::Foo'}} expected-note@@-6{{implicitly declared private here}}
}
}

namespace template_template_deduction {
void foo() __attribute__((enable_if(false, "")));
template <typename T>
T foo() __attribute__((enable_if(true, "")));

template <typename Fn, typename... Args> auto call(Fn F, Args... As) {
  return F(As...);
}

auto Ok = call(&foo<int>);
auto Fail = call(&foo); // expected-error{{no matching function for call to 'call'}} expected-note@@-5{{candidate template ignored: couldn't infer template argument 'Fn'}}

auto PtrOk = &foo<int>;
auto PtrFail = &foo; // expected-error{{variable 'PtrFail' with type 'auto' has incompatible initializer of type '<overloaded function type>'}}
}

namespace pointer_equality {
  using FnTy = void (*)();

  void bothEnableIf() __attribute__((enable_if(false, "")));
  void bothEnableIf() __attribute__((enable_if(true, "")));

  void oneEnableIf() __attribute__((enable_if(false, "")));
  void oneEnableIf();

  void test() {
    FnTy Fn;
    (void)(Fn == bothEnableIf);
    (void)(Fn == &bothEnableIf);
    (void)(Fn == oneEnableIf);
    (void)(Fn == &oneEnableIf);
  }

  void unavailableEnableIf() __attribute__((enable_if(false, "")));
  void unavailableEnableIf() __attribute__((unavailable("noooo"))); // expected-note 2{{marked unavailable here}}

  void testUnavailable() {
    FnTy Fn;
    (void)(Fn == unavailableEnableIf); // expected-error{{is unavailable}}
    (void)(Fn == &unavailableEnableIf); // expected-error{{is unavailable}}
  }

  class Foo {
    static void staticAccessEnableIf(); // expected-note 2{{declared private here}}
    void accessEnableIf(); // expected-note{{declared private here}}

  public:
    static void staticAccessEnableIf() __attribute__((enable_if(false, "")));
    void accessEnableIf() __attribute__((enable_if(false, "")));
  };

  void testAccess() {
    FnTy Fn;
    (void)(Fn == Foo::staticAccessEnableIf); // expected-error{{is a private member}}
    (void)(Fn == &Foo::staticAccessEnableIf); // expected-error{{is a private member}}

    void (Foo::*MemFn)();
    (void)(MemFn == &Foo::accessEnableIf); // expected-error{{is a private member}}
  }
}
@


1.1.1.1
log
@Import Clang pre-4.0.0 r291444.
@
text
@@


1.1.1.1.16.1
log
@Mostly merge changes from HEAD upto 20200411
@
text
@@


1.1.1.2
log
@Mark old LLVM instance as dead.
@
text
@@


1.1.1.1.4.1
log
@file unaddressable-functions.cpp was added on branch pgoyette-localcount on 2017-03-20 06:53:34 +0000
@
text
@d1 147
@


1.1.1.1.4.2
log
@Sync with HEAD
@
text
@a0 147
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++14

namespace access_control {
class Private {
  void check(int *) __attribute__((enable_if(false, "")));
  void check(double *) __attribute__((enable_if(true, "")));

  static void checkStatic(int *) __attribute__((enable_if(false, "")));
  static void checkStatic(double *) __attribute__((enable_if(true, "")));
};

auto Priv = reinterpret_cast<void (Private::*)(char *)>(&Private::check); // expected-error{{'check' is a private member of 'access_control::Private'}} expected-note@@6{{implicitly declared private here}}

auto PrivStatic = reinterpret_cast<void (*)(char *)>(&Private::checkStatic); // expected-error{{'checkStatic' is a private member of 'access_control::Private'}} expected-note@@9{{implicitly declared private here}}

class Protected {
protected:
  void check(int *) __attribute__((enable_if(false, "")));
  void check(double *) __attribute__((enable_if(true, "")));

  static void checkStatic(int *) __attribute__((enable_if(false, "")));
  static void checkStatic(double *) __attribute__((enable_if(true, "")));
};

auto Prot = reinterpret_cast<void (Protected::*)(char *)>(&Protected::check); // expected-error{{'check' is a protected member of 'access_control::Protected'}} expected-note@@19{{declared protected here}}

auto ProtStatic = reinterpret_cast<void (*)(char *)>(&Protected::checkStatic); // expected-error{{'checkStatic' is a protected member of 'access_control::Protected'}} expected-note@@22{{declared protected here}}
}

namespace unavailable {
// Ensure that we check that the function can be called
void foo() __attribute__((unavailable("don't call this")));
void foo(int) __attribute__((enable_if(false, "")));

void *Ptr = reinterpret_cast<void*>(foo); // expected-error{{'foo' is unavailable: don't call this}} expected-note@@-3{{explicitly marked unavailable here}}
}

namespace template_deduction {
void foo() __attribute__((enable_if(false, "")));

void bar() __attribute__((enable_if(true, "")));
void bar() __attribute__((enable_if(false, "")));

void baz(int a) __attribute__((enable_if(true, "")));
void baz(int a) __attribute__((enable_if(a, "")));
void baz(int a) __attribute__((enable_if(false, "")));

void qux(int a) __attribute__((enable_if(1, "")));
void qux(int a) __attribute__((enable_if(true, "")));
void qux(int a) __attribute__((enable_if(a, "")));
void qux(int a) __attribute__((enable_if(false, "")));

template <typename Fn, typename... Args> void call(Fn F, Args... As) {
  F(As...);
}

void test() {
  call(foo); // expected-error{{cannot take address of function 'foo'}}
  call(bar);
  call(baz, 0);
  call(qux, 0); // expected-error{{no matching function for call to 'call'}} expected-note@@53{{candidate template ignored: couldn't infer template argument 'Fn'}}

  auto Ptr1 = foo; // expected-error{{cannot take address of function 'foo'}}
  auto Ptr2 = bar;
  auto Ptr3 = baz;
  auto Ptr4 = qux; // expected-error{{variable 'Ptr4' with type 'auto' has incompatible initializer of type '<overloaded function type>'}}
}

template <typename Fn, typename T, typename... Args>
void callMem(Fn F, T t, Args... As) {
  (t.*F)(As...);
}

class Foo {
  void bar() __attribute__((enable_if(true, "")));
  void bar() __attribute__((enable_if(false, "")));

  static void staticBar() __attribute__((enable_if(true, "")));
  static void staticBar() __attribute__((enable_if(false, "")));
};

void testAccess() {
  callMem(&Foo::bar, Foo()); // expected-error{{'bar' is a private member of 'template_deduction::Foo'}} expected-note@@-8{{implicitly declared private here}}
  call(&Foo::staticBar); // expected-error{{'staticBar' is a private member of 'template_deduction::Foo'}} expected-note@@-6{{implicitly declared private here}}
}
}

namespace template_template_deduction {
void foo() __attribute__((enable_if(false, "")));
template <typename T>
T foo() __attribute__((enable_if(true, "")));

template <typename Fn, typename... Args> auto call(Fn F, Args... As) {
  return F(As...);
}

auto Ok = call(&foo<int>);
auto Fail = call(&foo); // expected-error{{no matching function for call to 'call'}} expected-note@@-5{{candidate template ignored: couldn't infer template argument 'Fn'}}

auto PtrOk = &foo<int>;
auto PtrFail = &foo; // expected-error{{variable 'PtrFail' with type 'auto' has incompatible initializer of type '<overloaded function type>'}}
}

namespace pointer_equality {
  using FnTy = void (*)();

  void bothEnableIf() __attribute__((enable_if(false, "")));
  void bothEnableIf() __attribute__((enable_if(true, "")));

  void oneEnableIf() __attribute__((enable_if(false, "")));
  void oneEnableIf();

  void test() {
    FnTy Fn;
    (void)(Fn == bothEnableIf);
    (void)(Fn == &bothEnableIf);
    (void)(Fn == oneEnableIf);
    (void)(Fn == &oneEnableIf);
  }

  void unavailableEnableIf() __attribute__((enable_if(false, "")));
  void unavailableEnableIf() __attribute__((unavailable("noooo"))); // expected-note 2{{marked unavailable here}}

  void testUnavailable() {
    FnTy Fn;
    (void)(Fn == unavailableEnableIf); // expected-error{{is unavailable}}
    (void)(Fn == &unavailableEnableIf); // expected-error{{is unavailable}}
  }

  class Foo {
    static void staticAccessEnableIf(); // expected-note 2{{declared private here}}
    void accessEnableIf(); // expected-note{{declared private here}}

  public:
    static void staticAccessEnableIf() __attribute__((enable_if(false, "")));
    void accessEnableIf() __attribute__((enable_if(false, "")));
  };

  void testAccess() {
    FnTy Fn;
    (void)(Fn == Foo::staticAccessEnableIf); // expected-error{{is a private member}}
    (void)(Fn == &Foo::staticAccessEnableIf); // expected-error{{is a private member}}

    void (Foo::*MemFn)();
    (void)(MemFn == &Foo::accessEnableIf); // expected-error{{is a private member}}
  }
}
@


