================
@@ -376,6 +376,33 @@ class Context {
     return getInfo(ID).Header.getName();
   }
 
+  /// Returns true if a library function is declared within a C or C++ standard
+  /// header (like stdio.h) or POSIX header (like malloc.h), false if the
+  /// function is not declared within a header or is declared in a non-standard
+  /// header (like Microsoft or Objective-C headers).
+  bool isDeclaredInStandardHeader(unsigned ID) const {
+    switch (getInfo(ID).Header.ID) {
+    default:
+      return false;
+    case HeaderDesc::COMPLEX_H: // C99
+    case HeaderDesc::CTYPE_H:   // C89
+    case HeaderDesc::MATH_H:    // C89
+    case HeaderDesc::MALLOC_H:  // POSIX
+    case HeaderDesc::MEMORY:    // C++98
+    case HeaderDesc::PTHREAD_H: // POSIX
+    case HeaderDesc::SETJMP_H:  // C89
+    case HeaderDesc::STDARG_H:  // C89
+    case HeaderDesc::STDIO_H:   // C89
+    case HeaderDesc::STDLIB_H:  // C89
+    case HeaderDesc::STRING_H:  // C89
+    case HeaderDesc::STRINGS_H: // POSIX
+    case HeaderDesc::UNISTD_H:  // POSIX
+    case HeaderDesc::UTILITY:   // C++98
+    case HeaderDesc::WCHAR_H:   // C99
+      return true;
+    }
+  }
----------------
ojhunt wrote:

Something like this would do it:
```diff
diff --git a/clang/include/clang/Basic/BuiltinHeaders.def 
b/clang/include/clang/Basic/BuiltinHeaders.def
index 8e4a2f9bee9a..bcbf15fdc91f 100644
--- a/clang/include/clang/Basic/BuiltinHeaders.def
+++ b/clang/include/clang/Basic/BuiltinHeaders.def
@@ -11,33 +11,33 @@
 //
 
//===----------------------------------------------------------------------===//
 
-HEADER(NO_HEADER, nullptr)
-HEADER(BLOCKS_H, "Blocks.h")
-HEADER(COMPLEX_H, "complex.h")
-HEADER(CTYPE_H, "ctype.h")
-HEADER(EMMINTRIN_H, "emmintrin.h")
-HEADER(FOUNDATION_NSOBJCRUNTIME_H, "Foundation/NSObjCRuntime.h")
-HEADER(IMMINTRIN_H, "immintrin.h")
-HEADER(INTRIN_H, "intrin.h")
-HEADER(MALLOC_H, "malloc.h")
-HEADER(MATH_H, "math.h")
-HEADER(MEMORY, "memory")
-HEADER(OBJC_MESSAGE_H, "objc/message.h")
-HEADER(OBJC_OBJC_AUTO_H, "objc/objc-auto.h")
-HEADER(OBJC_OBJC_EXCEPTION_H, "objc/objc-exception.h")
-HEADER(OBJC_OBJC_SYNC_H, "objc/objc-sync.h")
-HEADER(OBJC_RUNTIME_H, "objc/runtime.h")
-HEADER(PTHREAD_H, "pthread.h")
-HEADER(SETJMPEX_H, "setjmpex.h")
-HEADER(SETJMP_H, "setjmp.h")
-HEADER(STDARG_H, "stdarg.h")
-HEADER(STDIO_H, "stdio.h")
-HEADER(STDLIB_H, "stdlib.h")
-HEADER(STRINGS_H, "strings.h")
-HEADER(STRING_H, "string.h")
-HEADER(UNISTD_H, "unistd.h")
-HEADER(UTILITY, "utility")
-HEADER(WCHAR_H, "wchar.h")
-HEADER(XMMINTRIN_H, "xmmintrin.h")
+HEADER(NO_HEADER, nullptr, false)
+HEADER(BLOCKS_H, "Blocks.h", false)
+HEADER(COMPLEX_H, "complex.h", true)
+HEADER(CTYPE_H, "ctype.h", true)
+HEADER(EMMINTRIN_H, "emmintrin.h", false)
+HEADER(FOUNDATION_NSOBJCRUNTIME_H, "Foundation/NSObjCRuntime.h", false)
+HEADER(IMMINTRIN_H, "immintrin.h", false)
+HEADER(INTRIN_H, "intrin.h", false)
+HEADER(MALLOC_H, "malloc.h", true)
+HEADER(MATH_H, "math.h", true)
+HEADER(MEMORY, "memory", true)
+HEADER(OBJC_MESSAGE_H, "objc/message.h", false)
+HEADER(OBJC_OBJC_AUTO_H, "objc/objc-auto.h", false)
+HEADER(OBJC_OBJC_EXCEPTION_H, "objc/objc-exception.h", false)
+HEADER(OBJC_OBJC_SYNC_H, "objc/objc-sync.h", false)
+HEADER(OBJC_RUNTIME_H, "objc/runtime.h", false)
+HEADER(PTHREAD_H, "pthread.h", true)
+HEADER(SETJMPEX_H, "setjmpex.h", false)
+HEADER(SETJMP_H, "setjmp.h", true)
+HEADER(STDARG_H, "stdarg.h", true)
+HEADER(STDIO_H, "stdio.h", true)
+HEADER(STDLIB_H, "stdlib.h", true)
+HEADER(STRINGS_H, "strings.h", true)
+HEADER(STRING_H, "string.h", true)
+HEADER(UNISTD_H, "unistd.h", true)
+HEADER(UTILITY, "utility", true)
+HEADER(WCHAR_H, "wchar.h", true)
+HEADER(XMMINTRIN_H, "xmmintrin.h", false)
 
 #undef HEADER
diff --git a/clang/include/clang/Basic/Builtins.h 
b/clang/include/clang/Basic/Builtins.h
index f955d2116955..3847c0cb7481 100644
--- a/clang/include/clang/Basic/Builtins.h
+++ b/clang/include/clang/Basic/Builtins.h
@@ -50,7 +50,7 @@ enum LanguageID : uint16_t {
 
 struct HeaderDesc {
   enum HeaderID : uint16_t {
-#define HEADER(ID, NAME) ID,
+#define HEADER(ID, NAME, IS_STANDARD_HEADER) ID,
 #include "clang/Basic/BuiltinHeaders.def"
 #undef HEADER
   } ID;
@@ -222,6 +222,19 @@ public:
   const char *getHeaderName(unsigned ID) const {
     return getRecord(ID).Header.getName();
   }
+ /// Returns true if a library function is declared within a C or C++ standard
+  /// header (like stdio.h) or POSIX header (like malloc.h), false if the
+  /// function is not declared within a header or is declared in a non-standard
+  /// header (like Microsoft or Objective-C headers).
+  bool isDeclaredInStandardHeader(unsigned ID) const {
+    switch (getInfo(ID).Header.ID) {
+#define HEADER(ID, NAME, IS_STANDARD_HEADER)                                   
\
+  case ID:                                                                     
\
+    return IS_STANDARD_HEADER;
+#include "clang/Basic/BuiltinHeaders.def"
+#undef HEADER
+    };
+  }
 
   /// Determine whether this builtin is like printf in its
   /// formatting rules and, if so, set the index to the format string
diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index b116abbe034f..a5cb80067a4e 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -20,7 +20,7 @@ using namespace clang;
 
 const char *HeaderDesc::getName() const {
   switch (ID) {
-#define HEADER(ID, NAME)                                                       
\
+#define HEADER(ID, NAME, IS_STANDARD_HEADER)                                   
                    \
   case ID:                                                                     
\
     return NAME;
 #include "clang/Basic/BuiltinHeaders.def"
```

https://github.com/llvm/llvm-project/pull/149314
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to