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