/* RUN: %clang_cc1 -std=c89 -fsyntax-only -pedantic -verify %s RUN: %clang_cc1 -std=c99 -fsyntax-only -pedantic -verify %s RUN: %clang_cc1 -std=c11 -fsyntax-only -pedantic -verify %s RUN: %clang_cc1 -std=c17 -fsyntax-only -pedantic -verify %s RUN: %clang_cc1 -std=c2x -fsyntax-only -pedantic -verify %s */ /* WG14 DR157: yes * Legitimacy of type synonyms * * Part 1 is about whether you can use a typedef to void in place of void in * a function parameter list and still get a function with a prototype that * accepts no arguments. You can. * * Part 2 is about whether you can use a typedef to int in place of int in * the declaration of main(). You can. * * Part 3 is about whether there are situations where a typedef cannot be used * in place of a type name. */ typedef void dr157_1_t; extern int dr157(dr157_1_t); /* ok */ int dr157(dr157_1_t) { /* ok */ /* You cannot combine a typedef with another type specifier. */ typedef int Int; /* expected-note {{previous definition is here}} */ long Int val; /* expected-error {{redefinition of 'Int' as different kind of symbol}} expected-error {{expected ';' at end of declaration}} */ return 0; } typedef int dr157_2_t; dr157_2_t main(void) { /* Still a valid declaration of main() */ } /* A function definition cannot use a typedef for the type. */ typedef void dr157_3_t(void); extern dr157_3_t dr157_2 { /* expected-error {{expected ';' after top level declarator}} */ } /* FIXME: all diagnostics that happen after the previous one about expecting a * a ';' are silenced, so this test needs to be in its own file to prevent * accidentally incorrect testing. */