78 lines · c
1// RUN: %clang_cc1 -verify -std=c2y -DSTD1 %s2// RUN: %clang_cc1 -verify -std=c2y -DSTD2 %s3// RUN: %clang_cc1 -verify=gnu1 -std=gnu2y -DGNU1 %s4// RUN: %clang_cc1 -verify -std=gnu2y -DGNU2 %s5// RUN: %clang_cc1 -verify=gnu3 -std=gnu2y -DGNU3 %s6// RUN: %clang_cc1 -verify -std=gnu2y -DGNU4 %s7// RUN: %clang_cc1 -verify -std=gnu2y -DGNU5 %s8// RUN: %clang_cc1 -verify -std=gnu2y -DGNU6 %s9// RUN: %clang_cc1 -verify=gnu7 -std=gnu2y -DGNU7 %s10// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -verify -std=c2y -DDARWIN1 %s11// RUN: %clang_cc1 -triple x86_64-pc-win32-mscv -verify -std=c2y -fms-compatibility -DMS1 %s12// RUN: %clang_cc1 -triple x86_64-pc-win32-mscv -verify -std=c2y -fms-compatibility -DMS2 %s13// RUN: %clang_cc1 -verify=invalid -std=c2y -DINVALID1 %s14// RUN: %clang_cc1 -verify=invalid -std=c2y -DINVALID2 %s15// expected-no-diagnostics16 17/* WG14 N3623: Yes18 * Earthly Demon XV: Definition of Main19 *20 * This validates that we accept the standard type definitions of main or some21 * other implementation-defined type.22 */23 24typedef __WCHAR_TYPE__ wchar_t;25 26// These are the signatures required by the standard.27#if defined(STD1)28int main(void) {}29#elif defined(STD2)30int main(int argc, char *argv[]) {}31#endif32 33// GNU extensions.34#if defined(GNU1)35void main(void) {} /* gnu1-warning {{return type of 'main' is not 'int'}}36 gnu1-note {{change return type to 'int'}}37 */38#elif defined(GNU2)39const int main(void) {}40#elif defined(GNU3)41int main(...) {} /* gnu3-warning {{'main' is not allowed to be declared variadic}} */42#elif defined(GNU4)43int main(int, const char **) {}44#elif defined(GNU5)45int main(int, char const * const *) {}46#elif defined(GNU6)47int main(int, char * const *) {}48#elif defined(GNU7)49int main(int) {} /* gnu7-warning {{only one parameter on 'main' declaration}} */50#endif51 52// Darwin extensions.53#if defined(DARWIN1)54int main(int argc, char *argv[], char *environ[], char **undocumented) {}55#endif56 57// Microsoft extensions.58#if defined(MS1)59int wmain(int, wchar_t *[]) {}60#elif defined(MS2)61int wmain(int, wchar_t *[], wchar_t *[]) {}62#endif63 64// Invalid signatures.65#if defined(INVALID1)66inline int main(int, char *[]); /* invalid-error {{'main' is not allowed to be declared inline}} */67#if !__is_target_os(darwin)68// This test doesn't make sense on Darwin where four arguments are allowed.69int main(int, char *[], char *[], float); /* invalid-error {{too many parameters (4) for 'main': must be 0, 2, or 3}} */70#endif71float main(int); /* invalid-error {{'main' must return 'int'}} */72_Noreturn int main(int, char *[]); /* invalid-warning {{'main' is not allowed to be declared _Noreturn}}73 invalid-note {{remove '_Noreturn'}}74 */75#elif defined(INVALID2)76static int main(void); /* invalid-warning {{'main' should not be declared static}} */77#endif78