From a0933bd8ec1515167ea653f7ee788b8bbde27d51 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Wed, 8 May 2019 17:15:21 +0000 Subject: [PATCH] Include corecrt.h in stddef.h and vcruntime.h in stdarg.h to improve MS compatibility. This allows some applications developed with MSVC to compile with clang without any extra changes. Fixes: llvm.org/PR40789 Differential Revision: https://reviews.llvm.org/D61646 llvm-svn: 360271 --- clang/lib/Headers/stdarg.h | 5 +++++ clang/lib/Headers/stddef.h | 6 ++++++ clang/test/Headers/Inputs/ms-crt/corecrt.h | 1 + clang/test/Headers/Inputs/ms-crt/vcruntime.h | 1 + clang/test/Headers/c11.c | 3 ++- clang/test/Headers/ms-additional-includes.cpp | 10 ++++++++++ clang/test/Headers/ms-null-ms-header-vs-stddef.cpp | 3 ++- 7 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 clang/test/Headers/Inputs/ms-crt/corecrt.h create mode 100644 clang/test/Headers/Inputs/ms-crt/vcruntime.h create mode 100644 clang/test/Headers/ms-additional-includes.cpp diff --git a/clang/lib/Headers/stdarg.h b/clang/lib/Headers/stdarg.h index 0bc39408c1e5..97b3c082ec8b 100644 --- a/clang/lib/Headers/stdarg.h +++ b/clang/lib/Headers/stdarg.h @@ -10,6 +10,11 @@ #ifndef __STDARG_H #define __STDARG_H +#if defined(_MSC_VER) +/* Include otherwise unneeded header for MSVC compatibility. */ +#include +#endif + #ifndef _VA_LIST typedef __builtin_va_list va_list; #define _VA_LIST diff --git a/clang/lib/Headers/stddef.h b/clang/lib/Headers/stddef.h index 15acd4427ca1..860c909eff29 100644 --- a/clang/lib/Headers/stddef.h +++ b/clang/lib/Headers/stddef.h @@ -18,6 +18,12 @@ #if !__has_feature(modules) #define __STDDEF_H #endif + +#if defined(_MSC_VER) +/* Include otherwise unneeded header for MSVC compatibility. */ +#include +#endif + #define __need_ptrdiff_t #define __need_size_t #define __need_wchar_t diff --git a/clang/test/Headers/Inputs/ms-crt/corecrt.h b/clang/test/Headers/Inputs/ms-crt/corecrt.h new file mode 100644 index 000000000000..6f70f09beec2 --- /dev/null +++ b/clang/test/Headers/Inputs/ms-crt/corecrt.h @@ -0,0 +1 @@ +#pragma once diff --git a/clang/test/Headers/Inputs/ms-crt/vcruntime.h b/clang/test/Headers/Inputs/ms-crt/vcruntime.h new file mode 100644 index 000000000000..6f70f09beec2 --- /dev/null +++ b/clang/test/Headers/Inputs/ms-crt/vcruntime.h @@ -0,0 +1 @@ +#pragma once diff --git a/clang/test/Headers/c11.c b/clang/test/Headers/c11.c index 6594823c2733..e5e8ae425f9e 100644 --- a/clang/test/Headers/c11.c +++ b/clang/test/Headers/c11.c @@ -2,7 +2,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -fmodules -fmodules-cache-path=%t %s -D__STDC_WANT_LIB_EXT1__=1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s -// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -triple i686-pc-win32 -fms-compatibility-version=17.00 %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -triple i686-pc-win32 \ +// RUN: -fms-compatibility-version=17.00 -isystem %S/Inputs/ms-crt %s noreturn int f(); // expected-error 1+{{}} diff --git a/clang/test/Headers/ms-additional-includes.cpp b/clang/test/Headers/ms-additional-includes.cpp new file mode 100644 index 000000000000..3c6506a5a512 --- /dev/null +++ b/clang/test/Headers/ms-additional-includes.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -fsyntax-only --show-includes -triple i686-pc-win32 \ +// RUN: -isystem %S/Inputs/ms-crt -fms-compatibility-version=17.00 %s \ +// RUN: | FileCheck %s + +#include +// CHECK: including file:{{.*}}stddef.h +// CHECK: including file:{{.*}}corecrt.h +#include +// CHECK: including file:{{.*}}stdarg.h +// CHECK: including file:{{.*}}vcruntime.h diff --git a/clang/test/Headers/ms-null-ms-header-vs-stddef.cpp b/clang/test/Headers/ms-null-ms-header-vs-stddef.cpp index f39a0cafaa0d..bd81b6287bf4 100644 --- a/clang/test/Headers/ms-null-ms-header-vs-stddef.cpp +++ b/clang/test/Headers/ms-null-ms-header-vs-stddef.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -triple i686-pc-win32 -fms-compatibility -fms-compatibility-version=17.00 %s +// RUN: %clang_cc1 -fsyntax-only -triple i686-pc-win32 -fms-compatibility \ +// RUN: -isystem %S/Inputs/ms-crt -fms-compatibility-version=17.00 %s // RUN: %clang_cc1 -fsyntax-only -triple i386-mingw32 %s // Something in MSVC's headers (pulled in e.g. by ) defines __null