1 /* Another test case for over-eager multiple include optimization, 2 where the leading "#if !defined" expression is obtained partially, 3 or wholly, from macros. Neil Booth, 30 Sep 2001. */ 4 5 /* { dg-do compile } */ 6 /* { dg-options "" } */ 7 8 extern void abort (void); 9 10 /* Each include file should not be subject to MI optimisation, since 11 macro definitions can change. Each header increments the variable 12 VAR if it is defined. 13 14 The first set of inclusions gets the headers into CPP's cache, but 15 does nothing since VAR is not defined. The second set should each 16 increment VAR, since none of the initial set should have been 17 flagged as optimizable. */ 18 19 #define EMPTYL 20 #define EMPTYR 21 #define NOT ! 22 #define DEFINED defined (guard) 23 #define NOT_DEFINED ! defined (guard) 24 25 #include "mi6a.h" 26 #include "mi6b.h" 27 #include "mi6c.h" 28 #include "mi6d.h" 29 #include "mi6e.h" 30 31 /* Define the macro guard, and redefine the macros to something that 32 forces compilation of the conditional blocks. */ 33 #define guard 34 #undef EMPTYL 35 #define EMPTYL 1 || 36 #undef EMPTYR 37 #define EMPTYR || 1 38 #undef NOT 39 #define NOT 40 #undef DEFINED 41 #define DEFINED 0 42 #undef NOT_DEFINED 43 #define NOT_DEFINED 1 44 45 #define VAR five 46 47 int main(void)48main(void) 49 { 50 unsigned int five = 0; 51 52 #include "mi6a.h" 53 #include "mi6b.h" 54 #include "mi6c.h" 55 #include "mi6d.h" 56 #include "mi6e.h" 57 58 if (five != 5) 59 abort (); 60 return 0; 61 } 62