/* Another test case for over-eager multiple include optimization,
|
/* Another test case for over-eager multiple include optimization,
|
where the leading "#if !defined" expression is obtained partially,
|
where the leading "#if !defined" expression is obtained partially,
|
or wholly, from macros. Neil Booth, 30 Sep 2001. */
|
or wholly, from macros. Neil Booth, 30 Sep 2001. */
|
|
|
/* { dg-do compile } */
|
/* { dg-do compile } */
|
/* { dg-options "" } */
|
/* { dg-options "" } */
|
|
|
extern void abort (void);
|
extern void abort (void);
|
|
|
/* Each include file should not be subject to MI optimisation, since
|
/* Each include file should not be subject to MI optimisation, since
|
macro definitions can change. Each header increments the variable
|
macro definitions can change. Each header increments the variable
|
VAR if it is defined.
|
VAR if it is defined.
|
|
|
The first set of inclusions gets the headers into CPP's cache, but
|
The first set of inclusions gets the headers into CPP's cache, but
|
does nothing since VAR is not defined. The second set should each
|
does nothing since VAR is not defined. The second set should each
|
increment VAR, since none of the initial set should have been
|
increment VAR, since none of the initial set should have been
|
flagged as optimizable. */
|
flagged as optimizable. */
|
|
|
#define EMPTYL
|
#define EMPTYL
|
#define EMPTYR
|
#define EMPTYR
|
#define NOT !
|
#define NOT !
|
#define DEFINED defined (guard)
|
#define DEFINED defined (guard)
|
#define NOT_DEFINED ! defined (guard)
|
#define NOT_DEFINED ! defined (guard)
|
|
|
#include "mi6a.h"
|
#include "mi6a.h"
|
#include "mi6b.h"
|
#include "mi6b.h"
|
#include "mi6c.h"
|
#include "mi6c.h"
|
#include "mi6d.h"
|
#include "mi6d.h"
|
#include "mi6e.h"
|
#include "mi6e.h"
|
|
|
/* Define the macro guard, and redefine the macros to something that
|
/* Define the macro guard, and redefine the macros to something that
|
forces compilation of the conditional blocks. */
|
forces compilation of the conditional blocks. */
|
#define guard
|
#define guard
|
#undef EMPTYL
|
#undef EMPTYL
|
#define EMPTYL 1 ||
|
#define EMPTYL 1 ||
|
#undef EMPTYR
|
#undef EMPTYR
|
#define EMPTYR || 1
|
#define EMPTYR || 1
|
#undef NOT
|
#undef NOT
|
#define NOT
|
#define NOT
|
#undef DEFINED
|
#undef DEFINED
|
#define DEFINED 0
|
#define DEFINED 0
|
#undef NOT_DEFINED
|
#undef NOT_DEFINED
|
#define NOT_DEFINED 1
|
#define NOT_DEFINED 1
|
|
|
#define VAR five
|
#define VAR five
|
|
|
int
|
int
|
main(void)
|
main(void)
|
{
|
{
|
unsigned int five = 0;
|
unsigned int five = 0;
|
|
|
#include "mi6a.h"
|
#include "mi6a.h"
|
#include "mi6b.h"
|
#include "mi6b.h"
|
#include "mi6c.h"
|
#include "mi6c.h"
|
#include "mi6d.h"
|
#include "mi6d.h"
|
#include "mi6e.h"
|
#include "mi6e.h"
|
|
|
if (five != 5)
|
if (five != 5)
|
abort ();
|
abort ();
|
return 0;
|
return 0;
|
}
|
}
|
|
|