diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 09ba2c8b40fd282749cc63b86dce5fdb118d0649..fdddb98a74d1a97821854079278b5427e22816ce 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-20  Nathan Sidwell  <nathan@acm.org>
+
+	PR preprocessor/80005
+	* c-cppbuiltins.c (c_cpp_builtins): Don't define __has_include{,_next}.
+
 2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
 
 	* c-common.c (co_await, co_yield, co_return): New.
diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
index a6308921dc9a5716b43c868a9fb335cff72e6c84..70a12055e278ad41a0cbc9a3ca20975c0e84a548 100644
--- a/gcc/c-family/c-cppbuiltin.c
+++ b/gcc/c-family/c-cppbuiltin.c
@@ -876,12 +876,6 @@ c_cpp_builtins (cpp_reader *pfile)
   /* For stddef.h.  They require macros defined in c-common.c.  */
   c_stddef_cpp_builtins ();
 
-  /* Set include test macros for all C/C++ (not for just C++11 etc.)
-     The builtins __has_include__ and __has_include_next__ are defined
-     in libcpp.  */
-  cpp_define (pfile, "__has_include(STR)=__has_include__(STR)");
-  cpp_define (pfile, "__has_include_next(STR)=__has_include_next__(STR)");
-
   if (c_dialect_cxx ())
     {
       if (flag_weak && SUPPORTS_ONE_ONLY)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a526e32ac8936d856c45a8e59f52c001a43a1068..67d5f2e9e28677e6d748f4da57c76f9dd9327180 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2020-01-20  Nathan Sidwell  <nathan@acm.org>
+
+	PR preprocessor/80005
+	* g++.dg/cpp1y/feat-cxx14.C: Adjust.
+	* g++.dg/cpp1z/feat-cxx17.C: Adjust.
+	* g++.dg/cpp2a/feat-cxx2a.C: Adjust.
+	* g++.dg/cpp/pr80005.C: New.
+
 2020-01-20  Mark Eggleston  <mark.eggleston@codethink.com>
 
 	* gfortran.dg/pr93263_1.f90: Change scan-tree-dump-not to
diff --git a/gcc/testsuite/g++.dg/cpp/pr80005.C b/gcc/testsuite/g++.dg/cpp/pr80005.C
new file mode 100644
index 0000000000000000000000000000000000000000..cc752616782f655d35cf24644ae537ffa19eb08e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp/pr80005.C
@@ -0,0 +1,24 @@
+// PR preprocessor/80005
+// { dg-do preprocess }
+
+#undef vector
+#define vector NOPE
+#ifdef __has_include
+
+#if !__has_include (<vector>)
+#error "Header 'vector' could not be found"
+#endif
+#define F(X) __has_include (X)
+#if !F (<vector>)
+#error "Header 'vector' could not be found" // { dg-error "not be found" }
+#endif
+
+#if __has_include ("not an escape! \")	// comment
+#endif
+
+#if F ("is an escape \") gibberish ")
+#endif
+
+#else
+#error "No __has_include"
+#endif
diff --git a/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C b/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
index a2a93f437b3441b20d04709b2511bed3396b68c9..a78b6a36f36e1be190815c9dfad499f39e182ef3 100644
--- a/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
+++ b/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
@@ -236,20 +236,14 @@
 #  error "__has_include"
 #endif
 
-//  Quoted complex.h should find at least the bracket version (use operator).
-#if __has_include__ "complex.h"
-#else
-#  error "complex.h"
-#endif
-
 //  Try known bracket header (use operator).
-#if __has_include__(<complex>)
+#if __has_include (<complex>)
 #else
 #  error "<complex>"
 #endif
 
 //  Define and use a macro to invoke the operator.
-#define sluggo(TXT) __has_include__(TXT)
+#define sluggo(TXT) __has_include(TXT)
 
 #if sluggo(<complex>)
 #else
diff --git a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
index 55e56a06fe8f394e16bcb6a320fb24343c496fdd..e6f456b24154b9680d756db4d4c66791ff68cc1c 100644
--- a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
+++ b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C
@@ -225,20 +225,14 @@
 #  error "__has_include"
 #endif
 
-//  Quoted complex.h should find at least the bracket version (use operator).
-#if __has_include__ "complex.h"
-#else
-#  error "complex.h"
-#endif
-
 //  Try known bracket header (use operator).
-#if __has_include__(<complex>)
+#if __has_include (<complex>)
 #else
 #  error "<complex>"
 #endif
 
 //  Define and use a macro to invoke the operator.
-#define sluggo(TXT) __has_include__(TXT)
+#define sluggo(TXT) __has_include(TXT)
 
 #if sluggo(<complex>)
 #else
diff --git a/gcc/testsuite/g++.dg/cpp2a/feat-cxx2a.C b/gcc/testsuite/g++.dg/cpp2a/feat-cxx2a.C
index dd15cd6af3cb9c6a7b8308cd41771fcfc5d35168..82fd602f9f1d592cc4deafb22af2dd176d259d9b 100644
--- a/gcc/testsuite/g++.dg/cpp2a/feat-cxx2a.C
+++ b/gcc/testsuite/g++.dg/cpp2a/feat-cxx2a.C
@@ -224,20 +224,14 @@
 #  error "__has_include"
 #endif
 
-//  Quoted complex.h should find at least the bracket version (use operator).
-#if __has_include__ "complex.h"
-#else
-#  error "complex.h"
-#endif
-
 //  Try known bracket header (use operator).
-#if __has_include__(<complex>)
+#if __has_include (<complex>)
 #else
 #  error "<complex>"
 #endif
 
 //  Define and use a macro to invoke the operator.
-#define sluggo(TXT) __has_include__(TXT)
+#define sluggo(TXT) __has_include(TXT)
 
 #if sluggo(<complex>)
 #else
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 3249b93fe8840442594c06c6bb2628649499860a..27a841bbdcef48cd2d05546ac565a337045a559a 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,4 +1,31 @@
-2020-01-17  Nathan Sidwell  <nathan@acm.org>
+2020-01-20  Nathan Sidwell  <nathan@acm.org>
+
+	PR preprocessor/80005
+	* include/cpplib.h (BT_HAS_ATTRIBUTE): Fix comment.
+	* internal.h (struct lexer_state): Delete in__has_include field.
+	(struct spec_nodes): Rename n__has_include{,_next}__ fields.
+	(_cpp_defined_macro_p): New.
+	(_cpp_find_file): Add has_include parm.
+	* directives.c (lex_macro_node): Combine defined,
+	__has_inline{,_next} checking.
+	(do_ifdef, do_ifndef): Use _cpp_defined_macro_p.
+	(_cpp_init_directives): Refactor.
+	* expr.c (parse_defined): Use _cpp_defined_macro_p.
+	(eval_token): Adjust parse_has_include calls.
+	(parse_has_include): Add OP parameter.  Reimplement.
+	* files.c (_cpp_find_file): Add HAS_INCLUDE parm.  Use it to
+	inhibit error message.
+	(_cpp_stack_include): Adjust _cpp_find_file call.
+	(_cpp_fake_include, _cpp_compare_file_date): Likewise.
+	(open_file_failed): Remove in__has_include check.
+	(_cpp_has_header): Adjust _cpp_find_file call.
+	* identifiers.c (_cpp_init_hashtable): Don't init
+	__has_include{,_next} here ...
+	* init.c (cpp_init_builtins): ... init them here.  Define as
+	macros.
+	(cpp_read_main_file): Adjust _cpp_find_file call.
+	* pch.c (cpp_read_state): Adjust __has_include{,_next} access.
+	* traditional.c (_cpp_scan_out_locgical_line): Likewise.
 
 	PR preprocessor/93306
 	* expr.c (parse_has_include): Refactor.  Check skip_eval before
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 983206a5838e3b5c9a823a6cd37bd8e2d925575a..10735c8c6682290f476df51e6545db3b11a5cbe2 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -595,14 +595,13 @@ lex_macro_node (cpp_reader *pfile, bool is_def_or_undef)
     {
       cpp_hashnode *node = token->val.node.node;
 
-      if (is_def_or_undef && node == pfile->spec_nodes.n_defined)
+      if (is_def_or_undef
+	  && (node == pfile->spec_nodes.n_defined
+	      || node == pfile->spec_nodes.n__has_include
+	      || node == pfile->spec_nodes.n__has_include_next))
 	cpp_error (pfile, CPP_DL_ERROR,
-		   "\"defined\" cannot be used as a macro name");
-      else if (is_def_or_undef
-	    && (node == pfile->spec_nodes.n__has_include__
-	     || node == pfile->spec_nodes.n__has_include_next__))
-	cpp_error (pfile, CPP_DL_ERROR,
-		   "\"__has_include__\" cannot be used as a macro name");
+		   "\"%s\" cannot be used as a macro name",
+		   NODE_NAME (node));
       else if (! (node->flags & NODE_POISONED))
 	return node;
     }
@@ -1966,11 +1965,7 @@ do_ifdef (cpp_reader *pfile)
 
       if (node)
 	{
-	  /* Do not treat conditional macros as being defined.  This is due to
-	     the powerpc port using conditional macros for 'vector', 'bool',
-	     and 'pixel' to act as conditional keywords.  This messes up tests
-	     like #ifndef bool.  */
-	  skip = !cpp_macro_p (node) || (node->flags & NODE_CONDITIONAL);
+	  skip = !_cpp_defined_macro_p (node);
 	  _cpp_mark_macro_used (node);
 	  _cpp_maybe_notify_macro_use (pfile, node);
 	  if (pfile->cb.used)
@@ -1999,8 +1994,7 @@ do_ifndef (cpp_reader *pfile)
 	     the powerpc port using conditional macros for 'vector', 'bool',
 	     and 'pixel' to act as conditional keywords.  This messes up tests
 	     like #ifndef bool.  */
-	  skip = (cpp_macro_p (node)
-		  && !(node->flags & NODE_CONDITIONAL));
+	  skip = _cpp_defined_macro_p (node);
 	  _cpp_mark_macro_used (node);
 	  _cpp_maybe_notify_macro_use (pfile, node);
 	  if (pfile->cb.used)
@@ -2638,12 +2632,9 @@ _cpp_pop_buffer (cpp_reader *pfile)
 void
 _cpp_init_directives (cpp_reader *pfile)
 {
-  unsigned int i;
-  cpp_hashnode *node;
-
-  for (i = 0; i < (unsigned int) N_DIRECTIVES; i++)
+  for (int i = 0; i < N_DIRECTIVES; i++)
     {
-      node = cpp_lookup (pfile, dtable[i].name, dtable[i].length);
+      cpp_hashnode *node = cpp_lookup (pfile, dtable[i].name, dtable[i].length);
       node->is_directive = 1;
       node->directive_index = i;
     }
diff --git a/libcpp/expr.c b/libcpp/expr.c
index 317faf50208e853a26746424b9b894d26926813d..df21a4b9fb9f0992ab6fa90f921ce7cf33bd3e18 100644
--- a/libcpp/expr.c
+++ b/libcpp/expr.c
@@ -64,7 +64,7 @@ static unsigned int interpret_float_suffix (cpp_reader *, const uchar *, size_t)
 static unsigned int interpret_int_suffix (cpp_reader *, const uchar *, size_t);
 static void check_promotion (cpp_reader *, const struct op *);
 
-static cpp_num parse_has_include (cpp_reader *, enum include_type);
+static cpp_num parse_has_include (cpp_reader *, cpp_hashnode *, include_type);
 
 /* Token type abuse to create unary plus and minus operators.  */
 #define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
@@ -1088,8 +1088,7 @@ parse_defined (cpp_reader *pfile)
   result.unsignedp = false;
   result.high = 0;
   result.overflow = false;
-  result.low = (node && cpp_macro_p (node)
-		&& !(node->flags & NODE_CONDITIONAL));
+  result.low = node && _cpp_defined_macro_p (node);
   return result;
 }
 
@@ -1160,10 +1159,10 @@ eval_token (cpp_reader *pfile, const cpp_token *token,
     case CPP_NAME:
       if (token->val.node.node == pfile->spec_nodes.n_defined)
 	return parse_defined (pfile);
-      else if (token->val.node.node == pfile->spec_nodes.n__has_include__)
-	return parse_has_include (pfile, IT_INCLUDE);
-      else if (token->val.node.node == pfile->spec_nodes.n__has_include_next__)
-	return parse_has_include (pfile, IT_INCLUDE_NEXT);
+      else if (token->val.node.node == pfile->spec_nodes.n__has_include)
+	return parse_has_include (pfile, token->val.node.node, IT_INCLUDE);
+      else if (token->val.node.node == pfile->spec_nodes.n__has_include_next)
+	return parse_has_include (pfile, token->val.node.node, IT_INCLUDE_NEXT);
       else if (CPP_OPTION (pfile, cplusplus)
 	       && (token->val.node.node == pfile->spec_nodes.n_true
 		   || token->val.node.node == pfile->spec_nodes.n_false))
@@ -2190,9 +2189,9 @@ num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op,
   return lhs;
 }
 
-/* Handle meeting "__has_include__" in a preprocessor expression.  */
+/* Handle meeting "__has_include" in a preprocessor expression.  */
 static cpp_num
-parse_has_include (cpp_reader *pfile, enum include_type type)
+parse_has_include (cpp_reader *pfile, cpp_hashnode *op, include_type type)
 {
   cpp_num result;
 
@@ -2201,12 +2200,15 @@ parse_has_include (cpp_reader *pfile, enum include_type type)
   result.overflow = false;
   result.low = 0;
 
-  pfile->state.in__has_include__++;
-
+  pfile->state.angled_headers = true;
   const cpp_token *token = cpp_get_token (pfile);
   bool paren = token->type == CPP_OPEN_PAREN;
   if (paren)
     token = cpp_get_token (pfile);
+  else
+    cpp_error (pfile, CPP_DL_ERROR,
+	       "missing '(' before \"%s\" operand", NODE_NAME (op));
+  pfile->state.angled_headers = false;
 
   bool bracket = token->type != CPP_STRING;
   cpp_hashnode *node = NULL;
@@ -2222,7 +2224,7 @@ parse_has_include (cpp_reader *pfile, enum include_type type)
     fname = _cpp_bracket_include (pfile);
   else
     cpp_error (pfile, CPP_DL_ERROR,
-	       "operator \"__has_include__\" requires a header string");
+	       "operator \"%s\" requires a header-name", NODE_NAME (op));
 
   if (fname)
     {
@@ -2237,14 +2239,10 @@ parse_has_include (cpp_reader *pfile, enum include_type type)
 
   if (paren && !SEEN_EOL () && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
     cpp_error (pfile, CPP_DL_ERROR,
-	       "missing ')' after \"__has_include__\"");
+	       "missing ')' after \"%s\" operand", NODE_NAME (op));
 
-  /* A possible controlling macro of the form #if !__has_include__ ().
-     _cpp_parse_expr checks there was no other junk on the line.  */
   if (node)
     pfile->mi_ind_cmacro = node;
 
-  pfile->state.in__has_include__--;
-
   return result;
 }
diff --git a/libcpp/files.c b/libcpp/files.c
index 7abae7ae6ecb293d796043d75b2933ac7344f0b5..260e787c329e12982e9dabfa0e125877d49d7e6e 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -504,7 +504,8 @@ _cpp_find_failed (_cpp_file *file)
 
 _cpp_file *
 _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
-		bool fake, int angle_brackets, bool implicit_preinclude,
+		int angle_brackets,
+		bool fake, bool implicit_preinclude, bool has_include,
 		location_t loc)
 {
   struct cpp_file_hash_entry *entry;
@@ -592,7 +593,8 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
 		return NULL;
 	      }
 
-	    open_file_failed (pfile, file, angle_brackets, loc);
+	    if (!has_include)
+	      open_file_failed (pfile, file, angle_brackets, loc);
 	    break;
 	  }
 
@@ -1046,8 +1048,8 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
   if (!dir)
     return false;
 
-  _cpp_file *file = _cpp_find_file (pfile, fname, dir, false, angle_brackets,
-				    type == IT_DEFAULT, loc);
+  _cpp_file *file = _cpp_find_file (pfile, fname, dir, angle_brackets,
+				    false, type == IT_DEFAULT, false, loc);
   if (type == IT_DEFAULT && file == NULL)
     return false;
 
@@ -1062,9 +1064,6 @@ open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets,
   int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
   bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
 
-  if (pfile->state.in__has_include__)
-    return;
-
   errno = file->err_no;
   if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
     {
@@ -1343,7 +1342,8 @@ cpp_clear_file_cache (cpp_reader *pfile)
 void
 _cpp_fake_include (cpp_reader *pfile, const char *fname)
 {
-  _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0, false, 0);
+  _cpp_find_file (pfile, fname, pfile->buffer->file->dir,
+		  0, true, false, false, 0);
 }
 
 /* Not everyone who wants to set system-header-ness on a buffer can
@@ -1461,7 +1461,8 @@ _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
   if (!dir)
     return -1;
 
-  file = _cpp_find_file (pfile, fname, dir, false, angle_brackets, false, 0);
+  file = _cpp_find_file (pfile, fname, dir, angle_brackets,
+			 false, false, false, 0);
   if (file->err_no)
     return -1;
 
@@ -2004,9 +2005,11 @@ _cpp_has_header (cpp_reader *pfile, const char *fname, int angle_brackets,
 		 enum include_type type)
 {
   cpp_dir *start_dir = search_path_head (pfile, fname, angle_brackets, type);
-  _cpp_file *file = _cpp_find_file (pfile, fname, start_dir,
-				    /*fake=*/false, angle_brackets,
-				    /*implicit_preinclude=*/false, 0);
+  _cpp_file *file = _cpp_find_file (pfile, fname, start_dir, angle_brackets,
+				    /*fake=*/false,
+				    /*implicit_preinclude=*/false,
+				    /*has_include=*/true,
+				    0);
   return file->err_no != ENOENT;
 }
 
diff --git a/libcpp/identifiers.c b/libcpp/identifiers.c
index 562d8fee3b54b78ed82e7e197aa37c6aaf2ddd6f..9627e1bf4b0f0851ac86dae24734008b9cf838b1 100644
--- a/libcpp/identifiers.c
+++ b/libcpp/identifiers.c
@@ -72,8 +72,7 @@ _cpp_init_hashtable (cpp_reader *pfile, cpp_hash_table *table)
   s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC;
   s->n__VA_OPT__        = cpp_lookup (pfile, DSC("__VA_OPT__"));
   s->n__VA_OPT__->flags |= NODE_DIAGNOSTIC;
-  s->n__has_include__   = cpp_lookup (pfile, DSC("__has_include__"));
-  s->n__has_include_next__ = cpp_lookup (pfile, DSC("__has_include_next__"));
+  /* __has_include{,_next} are inited in cpp_init_builtins.  */
 }
 
 /* Tear down the identifier hash table.  */
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 1c26c365347722e3f000b5be621564e6ea27365a..56cbbd82750f272cf995b564d8276084725a32d9 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -859,7 +859,7 @@ enum cpp_builtin_type
   BT_PRAGMA,			/* `_Pragma' operator */
   BT_TIMESTAMP,			/* `__TIMESTAMP__' */
   BT_COUNTER,			/* `__COUNTER__' */
-  BT_HAS_ATTRIBUTE,		/* `__has_attribute__(x)' */
+  BT_HAS_ATTRIBUTE,		/* `__has_attribute(x)' */
   BT_HAS_BUILTIN		/* `__has_builtin(x)' */
 };
 
diff --git a/libcpp/init.c b/libcpp/init.c
index 2b4923e1451967f4cec1be2c6fe8420c553516b1..e798140ef8b4d1c38a715331b8744ad6b5a746ce 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -578,6 +578,17 @@ cpp_init_builtins (cpp_reader *pfile, int hosted)
 
   if (CPP_OPTION (pfile, objc))
     _cpp_define_builtin (pfile, "__OBJC__ 1");
+
+  /* These two behave as macros for #ifdef, but are evaluated
+     specially inside #if.  */
+  _cpp_define_builtin (pfile, "__has_include __has_include");
+  _cpp_define_builtin (pfile, "__has_include_next __has_include_next");
+  pfile->spec_nodes.n__has_include
+    = cpp_lookup (pfile, DSC("__has_include"));
+  pfile->spec_nodes.n__has_include->flags |= NODE_DIAGNOSTIC;
+  pfile->spec_nodes.n__has_include_next
+    = cpp_lookup (pfile, DSC("__has_include_next"));
+  pfile->spec_nodes.n__has_include_next->flags |= NODE_DIAGNOSTIC;
 }
 
 /* Sanity-checks are dependent on command-line options, so it is
@@ -672,7 +683,8 @@ cpp_read_main_file (cpp_reader *pfile, const char *fname)
     }
 
   pfile->main_file
-    = _cpp_find_file (pfile, fname, &pfile->no_search_path, false, 0, false,
+    = _cpp_find_file (pfile, fname, &pfile->no_search_path, /*angle=*/0,
+		      /*fake=*/false, /*preinclude=*/false, /*hasinclude=*/false,
 		      loc);
   if (_cpp_find_failed (pfile->main_file))
     return NULL;
diff --git a/libcpp/internal.h b/libcpp/internal.h
index 3623baf8191939d5a6d85753bfc9225f5f710adf..5453c3bff85f0029452d2a5ef26c9b808783a5ff 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -268,9 +268,6 @@ struct lexer_state
   /* Nonzero when parsing arguments to a function-like macro.  */
   unsigned char parsing_args;
 
-  /* Nonzero if in a __has_include__ or __has_include_next__ statement.  */
-  unsigned char in__has_include__;
-
   /* Nonzero if prevent_expansion is true only because output is
      being discarded.  */
   unsigned char discarding_output;
@@ -293,8 +290,8 @@ struct spec_nodes
   cpp_hashnode *n_false;		/* C++ keyword false */
   cpp_hashnode *n__VA_ARGS__;		/* C99 vararg macros */
   cpp_hashnode *n__VA_OPT__;		/* C++ vararg macros */
-  cpp_hashnode *n__has_include__;	/* __has_include__ operator */
-  cpp_hashnode *n__has_include_next__;	/* __has_include_next__ operator */
+  cpp_hashnode *n__has_include;		/* __has_include operator */
+  cpp_hashnode *n__has_include_next;	/* __has_include_next operator */
 };
 
 typedef struct _cpp_line_note _cpp_line_note;
@@ -641,6 +638,16 @@ cpp_in_primary_file (cpp_reader *pfile)
   return pfile->line_table->depth == 1;
 }
 
+/* True if NODE is a macro for the purposes of ifdef, defined etc.  */
+inline bool _cpp_defined_macro_p (cpp_hashnode *node)
+{
+  /* Do not treat conditional macros as being defined.  This is due to
+     the powerpc port using conditional macros for 'vector', 'bool',
+     and 'pixel' to act as conditional keywords.  This messes up tests
+     like #ifndef bool.  */
+  return cpp_macro_p (node) && !(node->flags & NODE_CONDITIONAL);
+}
+
 /* In macro.c */
 extern void _cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node);
 inline void _cpp_maybe_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node)
@@ -674,7 +681,8 @@ extern void _cpp_destroy_hashtable (cpp_reader *);
 /* In files.c */
 typedef struct _cpp_file _cpp_file;
 extern _cpp_file *_cpp_find_file (cpp_reader *, const char *, cpp_dir *,
-				  bool, int, bool, location_t);
+				  int angle, bool fake, bool preinclude,
+				  bool has_include, location_t);
 extern bool _cpp_find_failed (_cpp_file *);
 extern void _cpp_mark_file_once_only (cpp_reader *, struct _cpp_file *);
 extern void _cpp_fake_include (cpp_reader *, const char *);
diff --git a/libcpp/pch.c b/libcpp/pch.c
index 607f805bebe5a99c9d980e65805aa7337820c7ab..e631050936ba91791d6ee9078e246e1e6abe61e1 100644
--- a/libcpp/pch.c
+++ b/libcpp/pch.c
@@ -811,8 +811,8 @@ cpp_read_state (cpp_reader *r, const char *name, FILE *f,
     s->n_false		= cpp_lookup (r, DSC("false"));
     s->n__VA_ARGS__     = cpp_lookup (r, DSC("__VA_ARGS__"));
     s->n__VA_OPT__      = cpp_lookup (r, DSC("__VA_OPT__"));
-    s->n__has_include__ = cpp_lookup (r, DSC("__has_include__"));
-    s->n__has_include_next__ = cpp_lookup (r, DSC("__has_include_next__"));
+    s->n__has_include   = cpp_lookup (r, DSC("__has_include"));
+    s->n__has_include_next = cpp_lookup (r, DSC("__has_include_next"));
   }
 
   old_state = r->state;
diff --git a/libcpp/traditional.c b/libcpp/traditional.c
index 21c63b47dd555cfece56258f0d429ef53f02b01e..ff06d31a897b86871aad1cb3d38c3fc3a312fdaf 100644
--- a/libcpp/traditional.c
+++ b/libcpp/traditional.c
@@ -78,8 +78,8 @@ enum ls {ls_none = 0,		/* Normal state.  */
 	 ls_hash,		/* After # in preprocessor conditional.  */
 	 ls_predicate,		/* After the predicate, maybe paren?  */
 	 ls_answer,		/* In answer to predicate.  */
-	 ls_has_include,	/* After __has_include__.  */
-	 ls_has_include_close};	/* Looking for ')' of __has_include__.  */
+	 ls_has_include,	/* After __has_include.  */
+	 ls_has_include_close};	/* Looking for ')' of __has_include.  */
 
 /* Lexing TODO: Maybe handle space in escaped newlines.  Stop lex.c
    from recognizing comments and directives during its lexing pass.  */
@@ -565,8 +565,8 @@ _cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro *macro,
 		  continue;
 		}
 	      else if (pfile->state.in_expression
-		       && (node == pfile->spec_nodes.n__has_include__
-			|| node == pfile->spec_nodes.n__has_include_next__))
+		       && (node == pfile->spec_nodes.n__has_include
+			|| node == pfile->spec_nodes.n__has_include_next))
 		{
 		  lex_state = ls_has_include;
 		  continue;