1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl// Assignment of function pointers.
460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlstruct A
660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl};
860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlstruct B1 : A
1060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
1160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl};
1260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
1360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlstruct B2 : A
1460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
1560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl};
1660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
1760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlstruct D : B1, B2
1860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
1960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl};
2060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
2160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlstruct P : private A
2260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
2360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl};
2460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
2560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl// Some functions to play with below.
2660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s1() throw();
2760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s2() throw(int);
2860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s3() throw(A);
2960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s4() throw(B1);
3060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s5() throw(D);
3160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s6();
3260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s7() throw(int, float);
3360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid (*s8())() throw(B1); // s8 returns a pointer to function with spec
3460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s9(void (*)() throw(B1)); // s9 takes pointer to function with spec
3560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
3660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s10() noexcept;
3760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s11() noexcept(true);
3860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid s12() noexcept(false);
3960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
4060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid fnptrs()
4160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
4260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  // Assignment and initialization of function pointers.
4360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*t1)() throw() = &s1;    // valid
4460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t1 = &s2;                      // expected-error {{not superset}} expected-error {{incompatible type}}
4560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t1 = &s3;                      // expected-error {{not superset}} expected-error {{incompatible type}}
4660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (&t2)() throw() = s2;     // expected-error {{not superset}}
4760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*t3)() throw(int) = &s2; // valid
4860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*t4)() throw(A) = &s1;   // valid
4960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t4 = &s3;                      // valid
5060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t4 = &s4;                      // valid
5160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t4 = &s5;                      // expected-error {{not superset}} expected-error {{incompatible type}}
5260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*t5)() = &s1;            // valid
5360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t5 = &s2;                      // valid
5460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t5 = &s6;                      // valid
5560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t5 = &s7;                      // valid
5660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t1 = t3;                       // expected-error {{not superset}} expected-error {{incompatible type}}
5760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t3 = t1;                       // valid
5860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*t6)() throw(B1);
5960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t6 = t4;                       // expected-error {{not superset}} expected-error {{incompatible type}}
6060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t4 = t6;                       // valid
6160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t5 = t1;                       // valid
6260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  t1 = t5;                       // expected-error {{not superset}} expected-error {{incompatible type}}
6360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
6460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  // return types and arguments must match exactly, no inheritance allowed
6560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*(*t7)())() throw(B1) = &s8;       // valid
6660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*(*t8)())() throw(A) = &s8;        // expected-error {{return types differ}}
6760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (*(*t9)())() throw(D) = &s8;        // expected-error {{return types differ}}
6825582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith  void (*t10)(void (*)() throw(B1)) = &s9; // valid
6925582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith  void (*t11)(void (*)() throw(A)) = &s9;  // expected-error {{argument types differ}}
7025582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith  void (*t12)(void (*)() throw(D)) = &s9;  // expected-error {{argument types differ}}
7160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl}
7260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
7360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl// Member function stuff
7460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
7560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlstruct Str1 { void f() throw(int); }; // expected-note {{previous declaration}}
7660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid Str1::f() // expected-warning {{missing exception specification}}
7760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
7860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl}
7960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
8060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redlvoid mfnptr()
8160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl{
8260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (Str1::*pfn1)() throw(int) = &Str1::f; // valid
8360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (Str1::*pfn2)() = &Str1::f; // valid
8460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  void (Str1::*pfn3)() throw() = &Str1::f; // expected-error {{not superset}}
8560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl}
86