diff mbox series

[PR,93306] short circuit has_include

Message ID dabaca05-6dd9-ccf6-ee60-a4bf64ec4046@acm.org
State New
Headers show
Series [PR,93306] short circuit has_include | expand

Commit Message

Nathan Sidwell Jan. 17, 2020, 1:47 p.m. UTC
As Jonathan discovered,
#if FALSE_THING && has_include <foo>
still goes look for foo.

This patch makes the has_include evaluator check skip_eval before 
looking for foo -- but after parsing the has_include to diagnose 
ill-formedness.

Sadly, no testcase, because it's pretty much only observable via strace, 
which I did manually.

nathan
diff mbox series

Patch

2020-01-17  Nathan Sidwell  <nathan@acm.org>

	PR preprocessor/93306
	* expr.c (parse_has_include): Refactor.  Check skip_eval before
	looking.

diff --git c/libcpp/expr.c w/libcpp/expr.c
index 1078c0722f6..317faf50208 100644
--- c/libcpp/expr.c
+++ w/libcpp/expr.c
@@ -2195,11 +2195,6 @@  static cpp_num
 parse_has_include (cpp_reader *pfile, enum include_type type)
 {
   cpp_num result;
-  bool paren = false;
-  cpp_hashnode *node = 0;
-  const cpp_token *token;
-  bool bracket = false;
-  char *fname = 0;
 
   result.unsignedp = false;
   result.high = 0;
@@ -2208,39 +2203,34 @@  parse_has_include (cpp_reader *pfile, enum include_type type)
 
   pfile->state.in__has_include__++;
 
-  token = cpp_get_token (pfile);
-  if (token->type == CPP_OPEN_PAREN)
-    {
-      paren = true;
-      token = cpp_get_token (pfile);
-    }
+  const cpp_token *token = cpp_get_token (pfile);
+  bool paren = token->type == CPP_OPEN_PAREN;
+  if (paren)
+    token = cpp_get_token (pfile);
 
+  bool bracket = token->type != CPP_STRING;
+  cpp_hashnode *node = NULL;
+  char *fname = NULL;
   if (token->type == CPP_STRING || token->type == CPP_HEADER_NAME)
     {
-      if (token->type == CPP_HEADER_NAME)
-	bracket = true;
       fname = XNEWVEC (char, token->val.str.len - 1);
       memcpy (fname, token->val.str.text + 1, token->val.str.len - 2);
       fname[token->val.str.len - 2] = '\0';
       node = token->val.node.node;
     }
   else if (token->type == CPP_LESS)
-    {
-      bracket = true;
-      fname = _cpp_bracket_include (pfile);
-    }
+    fname = _cpp_bracket_include (pfile);
   else
     cpp_error (pfile, CPP_DL_ERROR,
 	       "operator \"__has_include__\" requires a header string");
 
   if (fname)
     {
-      int angle_brackets = (bracket ? 1 : 0);
-
-      if (_cpp_has_header (pfile, fname, angle_brackets, type))
+      /* Do not do the lookup if we're skipping, that's unnecessary
+	 IO.  */
+      if (!pfile->state.skip_eval
+	  && _cpp_has_header (pfile, fname, bracket, type))
 	result.low = 1;
-      else
-	result.low = 0;
 
       XDELETEVEC (fname);
     }