[clang] Using type deduction to define __SIZE_TYPE__ and __PTRDIFF_TYPE__ (PR #155979)

via cfe-commits cfe-commits at lists.llvm.org
Sat Aug 30 19:57:07 PDT 2025


https://github.com/YexuanXiao updated https://github.com/llvm/llvm-project/pull/155979

>From da3d78ad13eb53fa46f711cb295c60d9a6cebbab Mon Sep 17 00:00:00 2001
From: YexuanXiao <bizwen at nykz.org>
Date: Fri, 29 Aug 2025 13:46:55 +0800
Subject: [PATCH 1/2] Using type deduction to define __SIZE_TYPE__ and
 __PTRDIFF_TYPE__

---
 clang/lib/Frontend/InitPreprocessor.cpp   | 10 ++-
 clang/test/Preprocessor/init-aarch64.c    | 14 ++--
 clang/test/Preprocessor/init-arm.c        | 32 ++++----
 clang/test/Preprocessor/init-csky.c       |  4 +-
 clang/test/Preprocessor/init-loongarch.c  |  8 +-
 clang/test/Preprocessor/init-mips.c       | 24 +++---
 clang/test/Preprocessor/init-ppc.c        | 16 ++--
 clang/test/Preprocessor/init-ppc64.c      | 16 ++--
 clang/test/Preprocessor/init-s390x.c      |  4 +-
 clang/test/Preprocessor/init-v7k-compat.c |  4 +-
 clang/test/Preprocessor/init-ve.c         |  4 +-
 clang/test/Preprocessor/init-x86.c        | 36 ++++-----
 clang/test/Preprocessor/init.c            | 92 +++++++++++------------
 clang/test/Preprocessor/woa-defaults.c    |  4 +-
 clang/test/Sema/warn-bad-function-cast.c  |  7 +-
 15 files changed, 140 insertions(+), 135 deletions(-)

diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 4865c0b889044..5183afe6618b9 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -1175,13 +1175,15 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
   Builder.defineMacro("__UINTMAX_C_SUFFIX__", ConstSuffix);
   Builder.defineMacro("__UINTMAX_C(c)",
                       ConstSuffix.size() ? Twine("c##") + ConstSuffix : "c");
-  DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(LangAS::Default), Builder);
-  DefineFmt(LangOpts, "__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI,
-            Builder);
   DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder);
   DefineFmt(LangOpts, "__INTPTR", TI.getIntPtrType(), TI, Builder);
-  DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder);
+  // Use deduction to obtain the built-in __size_t and __ptrdiff_t types instead
+  // of standard integer types
+  Builder.defineMacro("__SIZE_TYPE__", "__typeof(sizeof(0))");
   DefineFmt(LangOpts, "__SIZE", TI.getSizeType(), TI, Builder);
+  Builder.defineMacro("__PTRDIFF_TYPE__", "__typeof((int*)0-(int*)0)");
+  DefineFmt(LangOpts, "__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI,
+            Builder);
   DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder);
   DefineType("__WINT_TYPE__", TI.getWIntType(), Builder);
   DefineTypeSizeAndWidth("__SIG_ATOMIC", TI.getSigAtomicType(), TI, Builder);
diff --git a/clang/test/Preprocessor/init-aarch64.c b/clang/test/Preprocessor/init-aarch64.c
index 3036b496db25d..91e1e502e5256 100644
--- a/clang/test/Preprocessor/init-aarch64.c
+++ b/clang/test/Preprocessor/init-aarch64.c
@@ -255,7 +255,7 @@
 // AARCH64-NEXT: #define __PTRDIFF_FMTd__ "ld"
 // AARCH64-NEXT: #define __PTRDIFF_FMTi__ "li"
 // AARCH64-NEXT: #define __PTRDIFF_MAX__ 9223372036854775807L
-// AARCH64-NEXT: #define __PTRDIFF_TYPE__ long int
+// AARCH64-NEXT: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // AARCH64-NEXT: #define __PTRDIFF_WIDTH__ 64
 // AARCH64-NEXT: #define __SCHAR_MAX__ 127
 // AARCH64-NEXT: #define __SHRT_MAX__ 32767
@@ -280,7 +280,7 @@
 // AARCH64-NEXT: #define __SIZE_FMTu__ "lu"
 // AARCH64-NEXT: #define __SIZE_FMTx__ "lx"
 // AARCH64-NEXT: #define __SIZE_MAX__ 18446744073709551615UL
-// AARCH64-NEXT: #define __SIZE_TYPE__ long unsigned int
+// AARCH64-NEXT: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // AARCH64-NEXT: #define __SIZE_WIDTH__ 64
 // AARCH64_CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // AARCH64_CXX: #define __STDCPP_THREADS__ 1
@@ -531,7 +531,7 @@
 // AARCH64-DARWIN: #define __LONG_MAX__ 9223372036854775807L
 // AARCH64-DARWIN: #define __LP64__ 1
 // AARCH64-DARWIN: #define __POINTER_WIDTH__ 64
-// AARCH64-DARWIN: #define __PTRDIFF_TYPE__ long int
+// AARCH64-DARWIN: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // AARCH64-DARWIN: #define __PTRDIFF_WIDTH__ 64
 // AARCH64-DARWIN: #define __SCHAR_MAX__ 127
 // AARCH64-DARWIN: #define __SHRT_MAX__ 32767
@@ -551,7 +551,7 @@
 // AARCH64-DARWIN: #define __SIZEOF_WCHAR_T__ 4
 // AARCH64-DARWIN: #define __SIZEOF_WINT_T__ 4
 // AARCH64-DARWIN: #define __SIZE_MAX__ 18446744073709551615UL
-// AARCH64-DARWIN: #define __SIZE_TYPE__ long unsigned int
+// AARCH64-DARWIN: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // AARCH64-DARWIN: #define __SIZE_WIDTH__ 64
 // AARCH64-DARWIN: #define __UINT16_C(c) c
 // AARCH64-DARWIN: #define __UINT16_C_SUFFIX__
@@ -716,7 +716,7 @@
 // AARCH64-MSVC: #define __SIZEOF_WCHAR_T__ 2
 // AARCH64-MSVC: #define __SIZEOF_WINT_T__ 2
 // AARCH64-MSVC: #define __SIZE_MAX__ 18446744073709551615ULL
-// AARCH64-MSVC: #define __SIZE_TYPE__ long long unsigned int
+// AARCH64-MSVC: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // AARCH64-MSVC: #define __SIZE_WIDTH__ 64
 // AARCH64-MSVC: #define __STDC_HOSTED__ 0
 // AARCH64-MSVC: #define __STDC_UTF_16__ 1
@@ -1010,7 +1010,7 @@
 // ARM64EC-MSVC: #define __PTRDIFF_FMTd__ "lld"
 // ARM64EC-MSVC: #define __PTRDIFF_FMTi__ "lli"
 // ARM64EC-MSVC: #define __PTRDIFF_MAX__ 9223372036854775807LL
-// ARM64EC-MSVC: #define __PTRDIFF_TYPE__ long long int
+// ARM64EC-MSVC: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARM64EC-MSVC: #define __PTRDIFF_WIDTH__ 64
 // ARM64EC-MSVC: #define __SCHAR_MAX__ 127
 // ARM64EC-MSVC: #define __SHRT_MAX__ 32767
@@ -1035,7 +1035,7 @@
 // ARM64EC-MSVC: #define __SIZE_FMTu__ "llu"
 // ARM64EC-MSVC: #define __SIZE_FMTx__ "llx"
 // ARM64EC-MSVC: #define __SIZE_MAX__ 18446744073709551615ULL
-// ARM64EC-MSVC: #define __SIZE_TYPE__ long long unsigned int
+// ARM64EC-MSVC: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARM64EC-MSVC: #define __SIZE_WIDTH__ 64
 // ARM64EC-MSVC: #define __STDC_HOSTED__ 0
 // ARM64EC-MSVC: #define __STDC_NO_THREADS__ 1
diff --git a/clang/test/Preprocessor/init-arm.c b/clang/test/Preprocessor/init-arm.c
index d2fcfe94bcd3d..50b199a38cbb0 100644
--- a/clang/test/Preprocessor/init-arm.c
+++ b/clang/test/Preprocessor/init-arm.c
@@ -133,7 +133,7 @@
 // ARM:#define __LONG_MAX__ 2147483647L
 // ARM-NOT:#define __LP64__
 // ARM:#define __POINTER_WIDTH__ 32
-// ARM:#define __PTRDIFF_TYPE__ int
+// ARM:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARM:#define __PTRDIFF_WIDTH__ 32
 // ARM:#define __REGISTER_PREFIX__
 // ARM:#define __SCHAR_MAX__ 127
@@ -153,7 +153,7 @@
 // ARM:#define __SIZEOF_WCHAR_T__ 4
 // ARM:#define __SIZEOF_WINT_T__ 4
 // ARM:#define __SIZE_MAX__ 4294967295U
-// ARM:#define __SIZE_TYPE__ unsigned int
+// ARM:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARM:#define __SIZE_WIDTH__ 32
 // ARM-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
 // ARM:#define __UINT16_C(c) c
@@ -213,8 +213,8 @@
 
 // RUN: %clang_cc1 -dM -ffreestanding -triple arm-none-none -target-abi apcs-gnu -E /dev/null -o - | FileCheck -match-full-lines -check-prefix ARM-APCS-GNU %s
 // ARM-APCS-GNU: #define __INTPTR_TYPE__ int
-// ARM-APCS-GNU: #define __PTRDIFF_TYPE__ int
-// ARM-APCS-GNU: #define __SIZE_TYPE__ unsigned int
+// ARM-APCS-GNU: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// ARM-APCS-GNU: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // RUN: %clang_cc1 -E -dM -ffreestanding -triple=armeb-none-none < /dev/null | FileCheck -match-full-lines -check-prefix ARM-BE %s
 //
@@ -344,7 +344,7 @@
 // ARM-BE:#define __LONG_MAX__ 2147483647L
 // ARM-BE-NOT:#define __LP64__
 // ARM-BE:#define __POINTER_WIDTH__ 32
-// ARM-BE:#define __PTRDIFF_TYPE__ int
+// ARM-BE:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARM-BE:#define __PTRDIFF_WIDTH__ 32
 // ARM-BE:#define __REGISTER_PREFIX__
 // ARM-BE:#define __SCHAR_MAX__ 127
@@ -364,7 +364,7 @@
 // ARM-BE:#define __SIZEOF_WCHAR_T__ 4
 // ARM-BE:#define __SIZEOF_WINT_T__ 4
 // ARM-BE:#define __SIZE_MAX__ 4294967295U
-// ARM-BE:#define __SIZE_TYPE__ unsigned int
+// ARM-BE:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARM-BE:#define __SIZE_WIDTH__ 32
 // ARM-BE:#define __UINT16_C(c) c
 // ARM-BE:#define __UINT16_C_SUFFIX__
@@ -547,7 +547,7 @@
 // ARMEABISOFT:#define __LONG_MAX__ 2147483647L
 // ARMEABISOFT-NOT:#define __LP64__
 // ARMEABISOFT:#define __POINTER_WIDTH__ 32
-// ARMEABISOFT:#define __PTRDIFF_TYPE__ int
+// ARMEABISOFT:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARMEABISOFT:#define __PTRDIFF_WIDTH__ 32
 // ARMEABISOFT:#define __REGISTER_PREFIX__
 // ARMEABISOFT:#define __SCHAR_MAX__ 127
@@ -567,7 +567,7 @@
 // ARMEABISOFT:#define __SIZEOF_WCHAR_T__ 4
 // ARMEABISOFT:#define __SIZEOF_WINT_T__ 4
 // ARMEABISOFT:#define __SIZE_MAX__ 4294967295U
-// ARMEABISOFT:#define __SIZE_TYPE__ unsigned int
+// ARMEABISOFT:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARMEABISOFT:#define __SIZE_WIDTH__ 32
 // ARMEABISOFT:#define __SOFTFP__ 1
 // ARMEABISOFT:#define __UINT16_C(c) c
@@ -757,7 +757,7 @@
 // ARMEABISOFTFP_NOFP:#define __LONG_MAX__ 2147483647L
 // ARMEABISOFTFP_NOFP-NOT:#define __LP64__
 // ARMEABISOFTFP_NOFP:#define __POINTER_WIDTH__ 32
-// ARMEABISOFTFP_NOFP:#define __PTRDIFF_TYPE__ int
+// ARMEABISOFTFP_NOFP:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARMEABISOFTFP_NOFP:#define __PTRDIFF_WIDTH__ 32
 // ARMEABISOFTFP_NOFP:#define __REGISTER_PREFIX__
 // ARMEABISOFTFP_NOFP:#define __SCHAR_MAX__ 127
@@ -777,7 +777,7 @@
 // ARMEABISOFTFP_NOFP:#define __SIZEOF_WCHAR_T__ 4
 // ARMEABISOFTFP_NOFP:#define __SIZEOF_WINT_T__ 4
 // ARMEABISOFTFP_NOFP:#define __SIZE_MAX__ 4294967295U
-// ARMEABISOFTFP_NOFP:#define __SIZE_TYPE__ unsigned int
+// ARMEABISOFTFP_NOFP:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARMEABISOFTFP_NOFP:#define __SIZE_WIDTH__ 32
 // ARMEABISOFTFP_NOFP:#define __SOFTFP__ 1
 // ARMEABISOFTFP_NOFP:#define __UINT16_C(c) c
@@ -961,7 +961,7 @@
 // ARMEABISOFTFP_FP:#define __LONG_MAX__ 2147483647L
 // ARMEABISOFTFP_FP-NOT:#define __LP64__
 // ARMEABISOFTFP_FP:#define __POINTER_WIDTH__ 32
-// ARMEABISOFTFP_FP:#define __PTRDIFF_TYPE__ int
+// ARMEABISOFTFP_FP:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARMEABISOFTFP_FP:#define __PTRDIFF_WIDTH__ 32
 // ARMEABISOFTFP_FP:#define __REGISTER_PREFIX__
 // ARMEABISOFTFP_FP:#define __SCHAR_MAX__ 127
@@ -981,7 +981,7 @@
 // ARMEABISOFTFP_FP:#define __SIZEOF_WCHAR_T__ 4
 // ARMEABISOFTFP_FP:#define __SIZEOF_WINT_T__ 4
 // ARMEABISOFTFP_FP:#define __SIZE_MAX__ 4294967295U
-// ARMEABISOFTFP_FP:#define __SIZE_TYPE__ unsigned int
+// ARMEABISOFTFP_FP:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARMEABISOFTFP_FP:#define __SIZE_WIDTH__ 32
 // ARMEABISOFTFP_FP-NOT:#define __SOFTFP__ 1
 // ARMEABISOFTFP_FP:#define __UINT16_C(c) c
@@ -1165,7 +1165,7 @@
 // ARMEABIHARDFP:#define __LONG_MAX__ 2147483647L
 // ARMEABIHARDFP-NOT:#define __LP64__
 // ARMEABIHARDFP:#define __POINTER_WIDTH__ 32
-// ARMEABIHARDFP:#define __PTRDIFF_TYPE__ int
+// ARMEABIHARDFP:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARMEABIHARDFP:#define __PTRDIFF_WIDTH__ 32
 // ARMEABIHARDFP:#define __REGISTER_PREFIX__
 // ARMEABIHARDFP:#define __SCHAR_MAX__ 127
@@ -1185,7 +1185,7 @@
 // ARMEABIHARDFP:#define __SIZEOF_WCHAR_T__ 4
 // ARMEABIHARDFP:#define __SIZEOF_WINT_T__ 4
 // ARMEABIHARDFP:#define __SIZE_MAX__ 4294967295U
-// ARMEABIHARDFP:#define __SIZE_TYPE__ unsigned int
+// ARMEABIHARDFP:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARMEABIHARDFP:#define __SIZE_WIDTH__ 32
 // ARMEABIHARDFP-NOT:#define __SOFTFP__ 1
 // ARMEABIHARDFP:#define __UINT16_C(c) c
@@ -1367,7 +1367,7 @@
 // ARM-NETBSD:#define __LONG_MAX__ 2147483647L
 // ARM-NETBSD-NOT:#define __LP64__
 // ARM-NETBSD:#define __POINTER_WIDTH__ 32
-// ARM-NETBSD:#define __PTRDIFF_TYPE__ long int
+// ARM-NETBSD:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // ARM-NETBSD:#define __PTRDIFF_WIDTH__ 32
 // ARM-NETBSD:#define __REGISTER_PREFIX__
 // ARM-NETBSD:#define __SCHAR_MAX__ 127
@@ -1387,7 +1387,7 @@
 // ARM-NETBSD:#define __SIZEOF_WCHAR_T__ 4
 // ARM-NETBSD:#define __SIZEOF_WINT_T__ 4
 // ARM-NETBSD:#define __SIZE_MAX__ 4294967295UL
-// ARM-NETBSD:#define __SIZE_TYPE__ long unsigned int
+// ARM-NETBSD:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // ARM-NETBSD:#define __SIZE_WIDTH__ 32
 // ARM-NETBSD:#define __SOFTFP__ 1
 // ARM-NETBSD:#define __UINT16_C(c) c
diff --git a/clang/test/Preprocessor/init-csky.c b/clang/test/Preprocessor/init-csky.c
index 99c5ad1010edb..da0b11e055d1e 100644
--- a/clang/test/Preprocessor/init-csky.c
+++ b/clang/test/Preprocessor/init-csky.c
@@ -130,7 +130,7 @@
 // CSKY: #define __POINTER_WIDTH__ 32
 // CSKY: #define __PRAGMA_REDEFINE_EXTNAME 1
 // CSKY: #define __PTRDIFF_MAX__ 2147483647
-// CSKY: #define __PTRDIFF_TYPE__ int
+// CSKY: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // CSKY: #define __PTRDIFF_WIDTH__ 32
 // CSKY: #define __SCHAR_MAX__ 127
 // CSKY: #define __SHRT_MAX__ 32767
@@ -150,7 +150,7 @@
 // CSKY: #define __SIZEOF_WCHAR_T__ 4
 // CSKY: #define __SIZEOF_WINT_T__ 4
 // CSKY: #define __SIZE_MAX__ 4294967295U
-// CSKY: #define __SIZE_TYPE__ unsigned int
+// CSKY: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // CSKY: #define __SIZE_WIDTH__ 32
 // CSKY: #define __STDC_HOSTED__ 0
 // CSKY: #define __STDC_UTF_16__ 1
diff --git a/clang/test/Preprocessor/init-loongarch.c b/clang/test/Preprocessor/init-loongarch.c
index 71a266b8a9157..9907a99166371 100644
--- a/clang/test/Preprocessor/init-loongarch.c
+++ b/clang/test/Preprocessor/init-loongarch.c
@@ -200,7 +200,7 @@
 // LA32: #define __PTRDIFF_FMTd__ "d"
 // LA32: #define __PTRDIFF_FMTi__ "i"
 // LA32: #define __PTRDIFF_MAX__ 2147483647
-// LA32: #define __PTRDIFF_TYPE__ int
+// LA32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // LA32: #define __PTRDIFF_WIDTH__ 32
 // LA32: #define __SCHAR_MAX__ 127
 // LA32: #define __SHRT_MAX__ 32767
@@ -225,7 +225,7 @@
 // LA32: #define __SIZE_FMTu__ "u"
 // LA32: #define __SIZE_FMTx__ "x"
 // LA32: #define __SIZE_MAX__ 4294967295U
-// LA32: #define __SIZE_TYPE__ unsigned int
+// LA32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // LA32: #define __SIZE_WIDTH__ 32
 // LA32: #define __STDC_HOSTED__ 0
 // LA32: #define __STDC_UTF_16__ 1
@@ -532,7 +532,7 @@
 // LA64: #define __PTRDIFF_FMTd__ "ld"
 // LA64: #define __PTRDIFF_FMTi__ "li"
 // LA64: #define __PTRDIFF_MAX__ 9223372036854775807L
-// LA64: #define __PTRDIFF_TYPE__ long int
+// LA64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // LA64: #define __PTRDIFF_WIDTH__ 64
 // LA64: #define __SCHAR_MAX__ 127
 // LA64: #define __SHRT_MAX__ 32767
@@ -557,7 +557,7 @@
 // LA64: #define __SIZE_FMTu__ "lu"
 // LA64: #define __SIZE_FMTx__ "lx"
 // LA64: #define __SIZE_MAX__ 18446744073709551615UL
-// LA64: #define __SIZE_TYPE__ long unsigned int
+// LA64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // LA64: #define __SIZE_WIDTH__ 64
 // LA64: #define __STDC_HOSTED__ 0
 // LA64: #define __STDC_UTF_16__ 1
diff --git a/clang/test/Preprocessor/init-mips.c b/clang/test/Preprocessor/init-mips.c
index 125872a001bac..46b25f07852f2 100644
--- a/clang/test/Preprocessor/init-mips.c
+++ b/clang/test/Preprocessor/init-mips.c
@@ -138,7 +138,7 @@
 // MIPS32BE:#define __MIPSEB__ 1
 // MIPS32BE:#define __POINTER_WIDTH__ 32
 // MIPS32BE:#define __PRAGMA_REDEFINE_EXTNAME 1
-// MIPS32BE:#define __PTRDIFF_TYPE__ int
+// MIPS32BE:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MIPS32BE:#define __PTRDIFF_WIDTH__ 32
 // MIPS32BE:#define __REGISTER_PREFIX__
 // MIPS32BE:#define __SCHAR_MAX__ 127
@@ -158,7 +158,7 @@
 // MIPS32BE:#define __SIZEOF_WCHAR_T__ 4
 // MIPS32BE:#define __SIZEOF_WINT_T__ 4
 // MIPS32BE:#define __SIZE_MAX__ 4294967295U
-// MIPS32BE:#define __SIZE_TYPE__ unsigned int
+// MIPS32BE:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // MIPS32BE:#define __SIZE_WIDTH__ 32
 // MIPS32BE-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
 // MIPS32BE:#define __STDC_HOSTED__ 0
@@ -359,7 +359,7 @@
 // MIPS32EL:#define __MIPSEL__ 1
 // MIPS32EL:#define __POINTER_WIDTH__ 32
 // MIPS32EL:#define __PRAGMA_REDEFINE_EXTNAME 1
-// MIPS32EL:#define __PTRDIFF_TYPE__ int
+// MIPS32EL:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MIPS32EL:#define __PTRDIFF_WIDTH__ 32
 // MIPS32EL:#define __REGISTER_PREFIX__
 // MIPS32EL:#define __SCHAR_MAX__ 127
@@ -379,7 +379,7 @@
 // MIPS32EL:#define __SIZEOF_WCHAR_T__ 4
 // MIPS32EL:#define __SIZEOF_WINT_T__ 4
 // MIPS32EL:#define __SIZE_MAX__ 4294967295U
-// MIPS32EL:#define __SIZE_TYPE__ unsigned int
+// MIPS32EL:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // MIPS32EL:#define __SIZE_WIDTH__ 32
 // MIPS32EL:#define __UINT16_C(c) c
 // MIPS32EL:#define __UINT16_C_SUFFIX__
@@ -611,7 +611,7 @@
 // MIPSN32BE: #define __PTRDIFF_FMTd__ "d"
 // MIPSN32BE: #define __PTRDIFF_FMTi__ "i"
 // MIPSN32BE: #define __PTRDIFF_MAX__ 2147483647
-// MIPSN32BE: #define __PTRDIFF_TYPE__ int
+// MIPSN32BE: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MIPSN32BE: #define __PTRDIFF_WIDTH__ 32
 // MIPSN32BE: #define __REGISTER_PREFIX__
 // MIPSN32BE: #define __SCHAR_MAX__ 127
@@ -635,7 +635,7 @@
 // MIPSN32BE: #define __SIZE_FMTu__ "u"
 // MIPSN32BE: #define __SIZE_FMTx__ "x"
 // MIPSN32BE: #define __SIZE_MAX__ 4294967295U
-// MIPSN32BE: #define __SIZE_TYPE__ unsigned int
+// MIPSN32BE: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // MIPSN32BE: #define __SIZE_WIDTH__ 32
 // MIPSN32BE-CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16U
 // MIPSN32BE: #define __STDC_HOSTED__ 0
@@ -929,7 +929,7 @@
 // MIPSN32EL: #define __PTRDIFF_FMTd__ "d"
 // MIPSN32EL: #define __PTRDIFF_FMTi__ "i"
 // MIPSN32EL: #define __PTRDIFF_MAX__ 2147483647
-// MIPSN32EL: #define __PTRDIFF_TYPE__ int
+// MIPSN32EL: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MIPSN32EL: #define __PTRDIFF_WIDTH__ 32
 // MIPSN32EL: #define __REGISTER_PREFIX__
 // MIPSN32EL: #define __SCHAR_MAX__ 127
@@ -953,7 +953,7 @@
 // MIPSN32EL: #define __SIZE_FMTu__ "u"
 // MIPSN32EL: #define __SIZE_FMTx__ "x"
 // MIPSN32EL: #define __SIZE_MAX__ 4294967295U
-// MIPSN32EL: #define __SIZE_TYPE__ unsigned int
+// MIPSN32EL: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // MIPSN32EL: #define __SIZE_WIDTH__ 32
 // MIPSN32EL: #define __STDC_HOSTED__ 0
 // MIPSN32EL: #define __STDC_UTF_16__ 1
@@ -1215,7 +1215,7 @@
 // MIPS64BE:#define __MIPSEB__ 1
 // MIPS64BE:#define __POINTER_WIDTH__ 64
 // MIPS64BE:#define __PRAGMA_REDEFINE_EXTNAME 1
-// MIPS64BE:#define __PTRDIFF_TYPE__ long int
+// MIPS64BE:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MIPS64BE:#define __PTRDIFF_WIDTH__ 64
 // MIPS64BE:#define __REGISTER_PREFIX__
 // MIPS64BE:#define __SCHAR_MAX__ 127
@@ -1236,7 +1236,7 @@
 // MIPS64BE:#define __SIZEOF_WCHAR_T__ 4
 // MIPS64BE:#define __SIZEOF_WINT_T__ 4
 // MIPS64BE:#define __SIZE_MAX__ 18446744073709551615UL
-// MIPS64BE:#define __SIZE_TYPE__ long unsigned int
+// MIPS64BE:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // MIPS64BE:#define __SIZE_WIDTH__ 64
 // MIPS64BE-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // MIPS64BE:#define __UINT16_C(c) c
@@ -1436,7 +1436,7 @@
 // MIPS64EL:#define __MIPSEL__ 1
 // MIPS64EL:#define __POINTER_WIDTH__ 64
 // MIPS64EL:#define __PRAGMA_REDEFINE_EXTNAME 1
-// MIPS64EL:#define __PTRDIFF_TYPE__ long int
+// MIPS64EL:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MIPS64EL:#define __PTRDIFF_WIDTH__ 64
 // MIPS64EL:#define __REGISTER_PREFIX__
 // MIPS64EL:#define __SCHAR_MAX__ 127
@@ -1457,7 +1457,7 @@
 // MIPS64EL:#define __SIZEOF_WCHAR_T__ 4
 // MIPS64EL:#define __SIZEOF_WINT_T__ 4
 // MIPS64EL:#define __SIZE_MAX__ 18446744073709551615UL
-// MIPS64EL:#define __SIZE_TYPE__ long unsigned int
+// MIPS64EL:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // MIPS64EL:#define __SIZE_WIDTH__ 64
 // MIPS64EL:#define __UINT16_C(c) c
 // MIPS64EL:#define __UINT16_C_SUFFIX__
diff --git a/clang/test/Preprocessor/init-ppc.c b/clang/test/Preprocessor/init-ppc.c
index 6b7eceda9b97b..2f73133cf6bd9 100644
--- a/clang/test/Preprocessor/init-ppc.c
+++ b/clang/test/Preprocessor/init-ppc.c
@@ -132,7 +132,7 @@
 // PPC603E:#define __POINTER_WIDTH__ 32
 // PPC603E:#define __POWERPC__ 1
 // PPC603E:#define __PPC__ 1
-// PPC603E:#define __PTRDIFF_TYPE__ long int
+// PPC603E:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC603E:#define __PTRDIFF_WIDTH__ 32
 // PPC603E:#define __REGISTER_PREFIX__
 // PPC603E:#define __SCHAR_MAX__ 127
@@ -152,7 +152,7 @@
 // PPC603E:#define __SIZEOF_WCHAR_T__ 4
 // PPC603E:#define __SIZEOF_WINT_T__ 4
 // PPC603E:#define __SIZE_MAX__ 4294967295UL
-// PPC603E:#define __SIZE_TYPE__ long unsigned int
+// PPC603E:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC603E:#define __SIZE_WIDTH__ 32
 // PPC603E-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // PPC603E:#define __UINT16_C(c) c
@@ -337,7 +337,7 @@
 // PPC:#define __POWERPC__ 1
 // PPC-NOT:#define __PPC 1
 // PPC:#define __PPC__ 1
-// PPC:#define __PTRDIFF_TYPE__ long int
+// PPC:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC:#define __PTRDIFF_WIDTH__ 32
 // PPC:#define __REGISTER_PREFIX__
 // PPC:#define __SCHAR_MAX__ 127
@@ -357,7 +357,7 @@
 // PPC:#define __SIZEOF_WCHAR_T__ 4
 // PPC:#define __SIZEOF_WINT_T__ 4
 // PPC:#define __SIZE_MAX__ 4294967295UL
-// PPC:#define __SIZE_TYPE__ long unsigned int
+// PPC:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC:#define __SIZE_WIDTH__ 32
 // PPC:#define __UINT16_C(c) c
 // PPC:#define __UINT16_C_SUFFIX__
@@ -546,7 +546,7 @@
 // PPC-AIX:#define __POWERPC__ 1
 // PPC-AIX:#define __PPC 1
 // PPC-AIX:#define __PPC__ 1
-// PPC-AIX:#define __PTRDIFF_TYPE__ long int
+// PPC-AIX:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC-AIX:#define __PTRDIFF_WIDTH__ 32
 // PPC-AIX:#define __REGISTER_PREFIX__
 // PPC-AIX:#define __SCHAR_MAX__ 127
@@ -566,7 +566,7 @@
 // PPC-AIX:#define __SIZEOF_WCHAR_T__ 2
 // PPC-AIX:#define __SIZEOF_WINT_T__ 4
 // PPC-AIX:#define __SIZE_MAX__ 4294967295UL
-// PPC-AIX:#define __SIZE_TYPE__ long unsigned int
+// PPC-AIX:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC-AIX:#define __SIZE_WIDTH__ 32
 // PPC-AIX:#define __THW_BIG_ENDIAN__ 1
 // PPC-AIX:#define __THW_PPC__ 1
@@ -928,7 +928,7 @@
 // PPC-LINUX:#define __POINTER_WIDTH__ 32
 // PPC-LINUX:#define __POWERPC__ 1
 // PPC-LINUX:#define __PPC__ 1
-// PPC-LINUX:#define __PTRDIFF_TYPE__ int
+// PPC-LINUX:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC-LINUX:#define __PTRDIFF_WIDTH__ 32
 // PPC-LINUX:#define __REGISTER_PREFIX__
 // PPC-LINUX:#define __SCHAR_MAX__ 127
@@ -948,7 +948,7 @@
 // PPC-LINUX:#define __SIZEOF_WCHAR_T__ 4
 // PPC-LINUX:#define __SIZEOF_WINT_T__ 4
 // PPC-LINUX:#define __SIZE_MAX__ 4294967295U
-// PPC-LINUX:#define __SIZE_TYPE__ unsigned int
+// PPC-LINUX:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC-LINUX:#define __SIZE_WIDTH__ 32
 // PPC-LINUX:#define __UINT16_C(c) c
 // PPC-LINUX:#define __UINT16_C_SUFFIX__
diff --git a/clang/test/Preprocessor/init-ppc64.c b/clang/test/Preprocessor/init-ppc64.c
index 7dffd4627481b..f1f7307f7653c 100644
--- a/clang/test/Preprocessor/init-ppc64.c
+++ b/clang/test/Preprocessor/init-ppc64.c
@@ -139,7 +139,7 @@
 // PPC64:#define __POWERPC__ 1
 // PPC64:#define __PPC64__ 1
 // PPC64:#define __PPC__ 1
-// PPC64:#define __PTRDIFF_TYPE__ long int
+// PPC64:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC64:#define __PTRDIFF_WIDTH__ 64
 // PPC64:#define __REGISTER_PREFIX__
 // PPC64:#define __SCHAR_MAX__ 127
@@ -159,7 +159,7 @@
 // PPC64:#define __SIZEOF_WCHAR_T__ 4
 // PPC64:#define __SIZEOF_WINT_T__ 4
 // PPC64:#define __SIZE_MAX__ 18446744073709551615UL
-// PPC64:#define __SIZE_TYPE__ long unsigned int
+// PPC64:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC64:#define __SIZE_WIDTH__ 64
 // PPC64-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // PPC64:#define __UINT16_C(c) c
@@ -353,7 +353,7 @@
 // PPC64LE:#define __POWERPC__ 1
 // PPC64LE:#define __PPC64__ 1
 // PPC64LE:#define __PPC__ 1
-// PPC64LE:#define __PTRDIFF_TYPE__ long int
+// PPC64LE:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC64LE:#define __PTRDIFF_WIDTH__ 64
 // PPC64LE:#define __REGISTER_PREFIX__
 // PPC64LE:#define __SCHAR_MAX__ 127
@@ -373,7 +373,7 @@
 // PPC64LE:#define __SIZEOF_WCHAR_T__ 4
 // PPC64LE:#define __SIZEOF_WINT_T__ 4
 // PPC64LE:#define __SIZE_MAX__ 18446744073709551615UL
-// PPC64LE:#define __SIZE_TYPE__ long unsigned int
+// PPC64LE:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC64LE:#define __SIZE_WIDTH__ 64
 // PPC64LE:#define __STRUCT_PARM_ALIGN__ 16
 // PPC64LE:#define __UINT16_C(c) c
@@ -844,7 +844,7 @@
 // PPC64-AIX:#define __POWERPC__ 1
 // PPC64-AIX:#define __PPC64__ 1
 // PPC64-AIX:#define __PPC__ 1
-// PPC64-AIX:#define __PTRDIFF_TYPE__ long int
+// PPC64-AIX:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC64-AIX:#define __PTRDIFF_WIDTH__ 64
 // PPC64-AIX:#define __REGISTER_PREFIX__
 // PPC64-AIX:#define __SCHAR_MAX__ 127
@@ -865,7 +865,7 @@
 // PPC64-AIX:#define __SIZEOF_WCHAR_T__ 4
 // PPC64-AIX:#define __SIZEOF_WINT_T__ 4
 // PPC64-AIX:#define __SIZE_MAX__ 18446744073709551615UL
-// PPC64-AIX:#define __SIZE_TYPE__ long unsigned int
+// PPC64-AIX:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC64-AIX:#define __SIZE_WIDTH__ 64
 // PPC64-AIX:#define __UINT16_C(c) c
 // PPC64-AIX:#define __UINT16_C_SUFFIX__
@@ -1052,7 +1052,7 @@
 // PPC64-LINUX:#define __POWERPC__ 1
 // PPC64-LINUX:#define __PPC64__ 1
 // PPC64-LINUX:#define __PPC__ 1
-// PPC64-LINUX:#define __PTRDIFF_TYPE__ long int
+// PPC64-LINUX:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PPC64-LINUX:#define __PTRDIFF_WIDTH__ 64
 // PPC64-LINUX:#define __REGISTER_PREFIX__
 // PPC64-LINUX:#define __SCHAR_MAX__ 127
@@ -1072,7 +1072,7 @@
 // PPC64-LINUX:#define __SIZEOF_WCHAR_T__ 4
 // PPC64-LINUX:#define __SIZEOF_WINT_T__ 4
 // PPC64-LINUX:#define __SIZE_MAX__ 18446744073709551615UL
-// PPC64-LINUX:#define __SIZE_TYPE__ long unsigned int
+// PPC64-LINUX:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PPC64-LINUX:#define __SIZE_WIDTH__ 64
 // PPC64-LINUX:#define __UINT16_C(c) c
 // PPC64-LINUX:#define __UINT16_C_SUFFIX__
diff --git a/clang/test/Preprocessor/init-s390x.c b/clang/test/Preprocessor/init-s390x.c
index a8fbde46cbb75..4f5f299fa2d0a 100644
--- a/clang/test/Preprocessor/init-s390x.c
+++ b/clang/test/Preprocessor/init-s390x.c
@@ -120,7 +120,7 @@
 // S390X:#define __LONG_MAX__ 9223372036854775807L
 // S390X:#define __NO_INLINE__ 1
 // S390X:#define __POINTER_WIDTH__ 64
-// S390X:#define __PTRDIFF_TYPE__ long int
+// S390X:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // S390X:#define __PTRDIFF_WIDTH__ 64
 // S390X:#define __SCHAR_MAX__ 127
 // S390X:#define __SHRT_MAX__ 32767
@@ -138,7 +138,7 @@
 // S390X:#define __SIZEOF_SIZE_T__ 8
 // S390X:#define __SIZEOF_WCHAR_T__ 4
 // S390X:#define __SIZEOF_WINT_T__ 4
-// S390X:#define __SIZE_TYPE__ long unsigned int
+// S390X:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // S390X:#define __SIZE_WIDTH__ 64
 // S390X-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8UL
 // S390X:#define __UINT16_C(c) c
diff --git a/clang/test/Preprocessor/init-v7k-compat.c b/clang/test/Preprocessor/init-v7k-compat.c
index a9c6e7a290646..697f31589c614 100644
--- a/clang/test/Preprocessor/init-v7k-compat.c
+++ b/clang/test/Preprocessor/init-v7k-compat.c
@@ -124,7 +124,7 @@
 // CHECK: #define __LONG_LONG_MAX__ 9223372036854775807LL
 // CHECK: #define __LONG_MAX__ 2147483647L
 // CHECK: #define __POINTER_WIDTH__ 32
-// CHECK: #define __PTRDIFF_TYPE__ long int
+// CHECK: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // CHECK: #define __PTRDIFF_WIDTH__ 32
 // CHECK: #define __SCHAR_MAX__ 127
 // CHECK: #define __SHRT_MAX__ 32767
@@ -143,7 +143,7 @@
 // CHECK: #define __SIZEOF_WCHAR_T__ 4
 // CHECK: #define __SIZEOF_WINT_T__ 4
 // CHECK: #define __SIZE_MAX__ 4294967295UL
-// CHECK: #define __SIZE_TYPE__ long unsigned int
+// CHECK: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // CHECK: #define __SIZE_WIDTH__ 32
 // CHECK: #define __UINT16_C(c) c
 // CHECK: #define __UINT16_C_SUFFIX__ {{$}}
diff --git a/clang/test/Preprocessor/init-ve.c b/clang/test/Preprocessor/init-ve.c
index 711c2a04865b3..99ed2f9292cd8 100644
--- a/clang/test/Preprocessor/init-ve.c
+++ b/clang/test/Preprocessor/init-ve.c
@@ -140,7 +140,7 @@
 // VE:#define __PTRDIFF_FMTd__ "ld"
 // VE:#define __PTRDIFF_FMTi__ "li"
 // VE:#define __PTRDIFF_MAX__ 9223372036854775807L
-// VE:#define __PTRDIFF_TYPE__ long int
+// VE:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // VE:#define __PTRDIFF_WIDTH__ 64
 // VE:#define __SCHAR_MAX__ 127
 // VE:#define __SHRT_MAX__ 32767
@@ -164,7 +164,7 @@
 // VE:#define __SIZE_FMTu__ "lu"
 // VE:#define __SIZE_FMTx__ "lx"
 // VE:#define __SIZE_MAX__ 18446744073709551615UL
-// VE:#define __SIZE_TYPE__ long unsigned int
+// VE:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // VE:#define __SIZE_WIDTH__ 64
 // VE-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // VE-HOSTED:#define __STDC_HOSTED__ 1
diff --git a/clang/test/Preprocessor/init-x86.c b/clang/test/Preprocessor/init-x86.c
index f5fd976b3db73..b1a9082b36e4b 100644
--- a/clang/test/Preprocessor/init-x86.c
+++ b/clang/test/Preprocessor/init-x86.c
@@ -123,7 +123,7 @@
 // I386-NOT:#define __LP64__
 // I386:#define __NO_MATH_INLINES 1
 // I386:#define __POINTER_WIDTH__ 32
-// I386:#define __PTRDIFF_TYPE__ int
+// I386:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // I386:#define __PTRDIFF_WIDTH__ 32
 // I386:#define __REGISTER_PREFIX__
 // I386:#define __SCHAR_MAX__ 127
@@ -143,7 +143,7 @@
 // I386:#define __SIZEOF_WCHAR_T__ 4
 // I386:#define __SIZEOF_WINT_T__ 4
 // I386:#define __SIZE_MAX__ 4294967295U
-// I386:#define __SIZE_TYPE__ unsigned int
+// I386:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // I386:#define __SIZE_WIDTH__ 32
 // I386:#define __UINT16_C(c) c
 // I386:#define __UINT16_C_SUFFIX__
@@ -333,7 +333,7 @@
 // I386-LINUX-NOT:#define __LP64__
 // I386-LINUX:#define __NO_MATH_INLINES 1
 // I386-LINUX:#define __POINTER_WIDTH__ 32
-// I386-LINUX:#define __PTRDIFF_TYPE__ int
+// I386-LINUX:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // I386-LINUX:#define __PTRDIFF_WIDTH__ 32
 // I386-LINUX:#define __REGISTER_PREFIX__
 // I386-LINUX:#define __SCHAR_MAX__ 127
@@ -353,7 +353,7 @@
 // I386-LINUX:#define __SIZEOF_WCHAR_T__ 4
 // I386-LINUX:#define __SIZEOF_WINT_T__ 4
 // I386-LINUX:#define __SIZE_MAX__ 4294967295U
-// I386-LINUX:#define __SIZE_TYPE__ unsigned int
+// I386-LINUX:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // I386-LINUX:#define __SIZE_WIDTH__ 32
 // I386-LINUX-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
 // I386-LINUX:#define __UINT16_C(c) c
@@ -544,7 +544,7 @@
 // I386-NETBSD-NOT:#define __LP64__
 // I386-NETBSD:#define __NO_MATH_INLINES 1
 // I386-NETBSD:#define __POINTER_WIDTH__ 32
-// I386-NETBSD:#define __PTRDIFF_TYPE__ int
+// I386-NETBSD:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // I386-NETBSD:#define __PTRDIFF_WIDTH__ 32
 // I386-NETBSD:#define __REGISTER_PREFIX__
 // I386-NETBSD:#define __SCHAR_MAX__ 127
@@ -564,7 +564,7 @@
 // I386-NETBSD:#define __SIZEOF_WCHAR_T__ 4
 // I386-NETBSD:#define __SIZEOF_WINT_T__ 4
 // I386-NETBSD:#define __SIZE_MAX__ 4294967295U
-// I386-NETBSD:#define __SIZE_TYPE__ unsigned int
+// I386-NETBSD:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // I386-NETBSD:#define __SIZE_WIDTH__ 32
 // I386-NETBSD-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 4U
 // I386-NETBSD:#define __UINT16_C(c) c
@@ -756,7 +756,7 @@
 // X86_64:#define __MMX__ 1
 // X86_64:#define __NO_MATH_INLINES 1
 // X86_64:#define __POINTER_WIDTH__ 64
-// X86_64:#define __PTRDIFF_TYPE__ long int
+// X86_64:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // X86_64:#define __PTRDIFF_WIDTH__ 64
 // X86_64:#define __REGISTER_PREFIX__
 // X86_64:#define __SCHAR_MAX__ 127
@@ -776,7 +776,7 @@
 // X86_64:#define __SIZEOF_WCHAR_T__ 4
 // X86_64:#define __SIZEOF_WINT_T__ 4
 // X86_64:#define __SIZE_MAX__ 18446744073709551615UL
-// X86_64:#define __SIZE_TYPE__ long unsigned int
+// X86_64:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // X86_64:#define __SIZE_WIDTH__ 64
 // X86_64:#define __SSE2_MATH__ 1
 // X86_64:#define __SSE2__ 1
@@ -970,7 +970,7 @@
 // X32:#define __MMX__ 1
 // X32:#define __NO_MATH_INLINES 1
 // X32:#define __POINTER_WIDTH__ 32
-// X32:#define __PTRDIFF_TYPE__ int
+// X32:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // X32:#define __PTRDIFF_WIDTH__ 32
 // X32:#define __REGISTER_PREFIX__
 // X32:#define __SCHAR_MAX__ 127
@@ -990,7 +990,7 @@
 // X32:#define __SIZEOF_WCHAR_T__ 4
 // X32:#define __SIZEOF_WINT_T__ 4
 // X32:#define __SIZE_MAX__ 4294967295U
-// X32:#define __SIZE_TYPE__ unsigned int
+// X32:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // X32:#define __SIZE_WIDTH__ 32
 // X32:#define __SSE2_MATH__ 1
 // X32:#define __SSE2__ 1
@@ -1185,7 +1185,7 @@
 // X86_64-LINUX:#define __MMX__ 1
 // X86_64-LINUX:#define __NO_MATH_INLINES 1
 // X86_64-LINUX:#define __POINTER_WIDTH__ 64
-// X86_64-LINUX:#define __PTRDIFF_TYPE__ long int
+// X86_64-LINUX:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // X86_64-LINUX:#define __PTRDIFF_WIDTH__ 64
 // X86_64-LINUX:#define __REGISTER_PREFIX__
 // X86_64-LINUX:#define __SCHAR_MAX__ 127
@@ -1205,7 +1205,7 @@
 // X86_64-LINUX:#define __SIZEOF_WCHAR_T__ 4
 // X86_64-LINUX:#define __SIZEOF_WINT_T__ 4
 // X86_64-LINUX:#define __SIZE_MAX__ 18446744073709551615UL
-// X86_64-LINUX:#define __SIZE_TYPE__ long unsigned int
+// X86_64-LINUX:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // X86_64-LINUX:#define __SIZE_WIDTH__ 64
 // X86_64-LINUX:#define __SSE2_MATH__ 1
 // X86_64-LINUX:#define __SSE2__ 1
@@ -1407,7 +1407,7 @@
 // X86_64-NETBSD:#define __MMX__ 1
 // X86_64-NETBSD:#define __NO_MATH_INLINES 1
 // X86_64-NETBSD:#define __POINTER_WIDTH__ 64
-// X86_64-NETBSD:#define __PTRDIFF_TYPE__ long int
+// X86_64-NETBSD:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // X86_64-NETBSD:#define __PTRDIFF_WIDTH__ 64
 // X86_64-NETBSD:#define __REGISTER_PREFIX__
 // X86_64-NETBSD:#define __SCHAR_MAX__ 127
@@ -1427,7 +1427,7 @@
 // X86_64-NETBSD:#define __SIZEOF_WCHAR_T__ 4
 // X86_64-NETBSD:#define __SIZEOF_WINT_T__ 4
 // X86_64-NETBSD:#define __SIZE_MAX__ 18446744073709551615UL
-// X86_64-NETBSD:#define __SIZE_TYPE__ long unsigned int
+// X86_64-NETBSD:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // X86_64-NETBSD:#define __SIZE_WIDTH__ 64
 // X86_64-NETBSD:#define __SSE2_MATH__ 1
 // X86_64-NETBSD:#define __SSE2__ 1
@@ -1625,7 +1625,7 @@
 // I386-CYGWIN-NOT:#define __LP64__
 // I386-CYGWIN:#define __NO_MATH_INLINES 1
 // I386-CYGWIN:#define __POINTER_WIDTH__ 32
-// I386-CYGWIN:#define __PTRDIFF_TYPE__ int
+// I386-CYGWIN:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // I386-CYGWIN:#define __PTRDIFF_WIDTH__ 32
 // I386-CYGWIN:#define __REGISTER_PREFIX__
 // I386-CYGWIN:#define __SCHAR_MAX__ 127
@@ -1645,7 +1645,7 @@
 // I386-CYGWIN:#define __SIZEOF_WCHAR_T__ 2
 // I386-CYGWIN:#define __SIZEOF_WINT_T__ 4
 // I386-CYGWIN:#define __SIZE_MAX__ 4294967295U
-// I386-CYGWIN:#define __SIZE_TYPE__ unsigned int
+// I386-CYGWIN:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // I386-CYGWIN:#define __SIZE_WIDTH__ 32
 // I386-CYGWIN:#define __UINT16_C(c) c
 // I386-CYGWIN:#define __UINT16_C_SUFFIX__
@@ -1837,7 +1837,7 @@
 // X86_64-CYGWIN:#define __MMX__ 1
 // X86_64-CYGWIN:#define __NO_MATH_INLINES 1
 // X86_64-CYGWIN:#define __POINTER_WIDTH__ 64
-// X86_64-CYGWIN:#define __PTRDIFF_TYPE__ long int
+// X86_64-CYGWIN:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // X86_64-CYGWIN:#define __PTRDIFF_WIDTH__ 64
 // X86_64-CYGWIN:#define __REGISTER_PREFIX__
 // X86_64-CYGWIN:#define __SCHAR_MAX__ 127
@@ -1857,7 +1857,7 @@
 // X86_64-CYGWIN:#define __SIZEOF_WCHAR_T__ 2
 // X86_64-CYGWIN:#define __SIZEOF_WINT_T__ 4
 // X86_64-CYGWIN:#define __SIZE_MAX__ 18446744073709551615UL
-// X86_64-CYGWIN:#define __SIZE_TYPE__ long unsigned int
+// X86_64-CYGWIN:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // X86_64-CYGWIN:#define __SIZE_WIDTH__ 64
 // X86_64-CYGWIN:#define __SSE2_MATH__ 1
 // X86_64-CYGWIN:#define __SSE2__ 1
diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c
index 7e0df96141364..cca0f71a12d8f 100644
--- a/clang/test/Preprocessor/init.c
+++ b/clang/test/Preprocessor/init.c
@@ -514,7 +514,7 @@
 // MSP430-NOT:#define __LP64__
 // MSP430:#define __MSP430__ 1
 // MSP430:#define __POINTER_WIDTH__ 16
-// MSP430:#define __PTRDIFF_TYPE__ int
+// MSP430:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // MSP430:#define __PTRDIFF_WIDTH__ 16
 // MSP430:#define __SCHAR_MAX__ 127
 // MSP430:#define __SHRT_MAX__ 32767
@@ -533,7 +533,7 @@
 // MSP430:#define __SIZEOF_WCHAR_T__ 2
 // MSP430:#define __SIZEOF_WINT_T__ 2
 // MSP430:#define __SIZE_MAX__ 65535U
-// MSP430:#define __SIZE_TYPE__ unsigned int
+// MSP430:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // MSP430:#define __SIZE_WIDTH__ 16
 // MSP430-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 2U
 // MSP430:#define __UINT16_C(c) c##U
@@ -712,7 +712,7 @@
 // NVPTX32:#define __NVPTX__ 1
 // NVPTX32:#define __POINTER_WIDTH__ 32
 // NVPTX32:#define __PRAGMA_REDEFINE_EXTNAME 1
-// NVPTX32:#define __PTRDIFF_TYPE__ int
+// NVPTX32:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // NVPTX32:#define __PTRDIFF_WIDTH__ 32
 // NVPTX32:#define __PTX__ 1
 // NVPTX32:#define __SCHAR_MAX__ 127
@@ -732,7 +732,7 @@
 // NVPTX32:#define __SIZEOF_WCHAR_T__ 4
 // NVPTX32:#define __SIZEOF_WINT_T__ 4
 // NVPTX32:#define __SIZE_MAX__ 4294967295U
-// NVPTX32:#define __SIZE_TYPE__ unsigned int
+// NVPTX32:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // NVPTX32:#define __SIZE_WIDTH__ 32
 // NVPTX32-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
 // NVPTX32:#define __UINT16_C(c) c
@@ -910,7 +910,7 @@
 // NVPTX64:#define __NVPTX__ 1
 // NVPTX64:#define __POINTER_WIDTH__ 64
 // NVPTX64:#define __PRAGMA_REDEFINE_EXTNAME 1
-// NVPTX64:#define __PTRDIFF_TYPE__ long int
+// NVPTX64:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // NVPTX64:#define __PTRDIFF_WIDTH__ 64
 // NVPTX64:#define __PTX__ 1
 // NVPTX64:#define __SCHAR_MAX__ 127
@@ -930,7 +930,7 @@
 // NVPTX64:#define __SIZEOF_WCHAR_T__ 4
 // NVPTX64:#define __SIZEOF_WINT_T__ 4
 // NVPTX64:#define __SIZE_MAX__ 18446744073709551615UL
-// NVPTX64:#define __SIZE_TYPE__ long unsigned int
+// NVPTX64:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // NVPTX64:#define __SIZE_WIDTH__ 64
 // NVPTX64-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8UL
 // NVPTX64:#define __UINT16_C(c) c
@@ -1123,8 +1123,8 @@
 // SPARC:#define __LONG_MAX__ 2147483647L
 // SPARC-NOT:#define __LP64__
 // SPARC:#define __POINTER_WIDTH__ 32
-// SPARC-DEFAULT:#define __PTRDIFF_TYPE__ int
-// SPARC-NETOPENBSD:#define __PTRDIFF_TYPE__ long int
+// SPARC-DEFAULT:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// SPARC-NETOPENBSD:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // SPARC:#define __PTRDIFF_WIDTH__ 32
 // SPARC:#define __REGISTER_PREFIX__
 // SPARC:#define __SCHAR_MAX__ 127
@@ -1144,9 +1144,9 @@
 // SPARC:#define __SIZEOF_WCHAR_T__ 4
 // SPARC:#define __SIZEOF_WINT_T__ 4
 // SPARC-DEFAULT:#define __SIZE_MAX__ 4294967295U
-// SPARC-DEFAULT:#define __SIZE_TYPE__ unsigned int
+// SPARC-DEFAULT:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // SPARC-NETOPENBSD:#define __SIZE_MAX__ 4294967295UL
-// SPARC-NETOPENBSD:#define __SIZE_TYPE__ long unsigned int
+// SPARC-NETOPENBSD:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // SPARC:#define __SIZE_WIDTH__ 32
 // SPARC-DEFAULT-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
 // SPARC:#define __UINT16_C(c) c
@@ -1313,7 +1313,7 @@
 // TCE:#define __LONG_MAX__ 2147483647L
 // TCE-NOT:#define __LP64__
 // TCE:#define __POINTER_WIDTH__ 32
-// TCE:#define __PTRDIFF_TYPE__ int
+// TCE:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // TCE:#define __PTRDIFF_WIDTH__ 32
 // TCE:#define __SCHAR_MAX__ 127
 // TCE:#define __SHRT_MAX__ 32767
@@ -1332,7 +1332,7 @@
 // TCE:#define __SIZEOF_WCHAR_T__ 4
 // TCE:#define __SIZEOF_WINT_T__ 4
 // TCE:#define __SIZE_MAX__ 4294967295U
-// TCE:#define __SIZE_TYPE__ unsigned int
+// TCE:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // TCE:#define __SIZE_WIDTH__ 32
 // TCE-CXX:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 4U
 // TCE:#define __TCE_V1__ 1
@@ -1455,7 +1455,7 @@
 // PS4:#define __POINTER_WIDTH__ 64
 // PS5ONLY:#define __PROSPERO__ 1
 // PS4:#define __PTRDIFF_MAX__ 9223372036854775807L
-// PS4:#define __PTRDIFF_TYPE__ long int
+// PS4:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // PS4:#define __PTRDIFF_WIDTH__ 64
 // PS4:#define __REGISTER_PREFIX__
 // PS4:#define __SCE__ 1
@@ -1475,7 +1475,7 @@
 // PS4:#define __SIZEOF_SIZE_T__ 8
 // PS4:#define __SIZEOF_WCHAR_T__ 2
 // PS4:#define __SIZEOF_WINT_T__ 4
-// PS4:#define __SIZE_TYPE__ long unsigned int
+// PS4:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // PS4:#define __SIZE_WIDTH__ 64
 // PS4:#define __SSE2_MATH__ 1
 // PS4:#define __SSE2__ 1
@@ -1603,8 +1603,8 @@
 // OPENBSD:#define __INTMAX_TYPE__ long long int
 // OPENBSD:#define __INTPTR_TYPE__ long int
 // OPENBSD:#define __OpenBSD__ 1
-// OPENBSD:#define __PTRDIFF_TYPE__ long int
-// OPENBSD:#define __SIZE_TYPE__ long unsigned int
+// OPENBSD:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// OPENBSD:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // OPENBSD:#define __UINT16_TYPE__ unsigned short
 // OPENBSD:#define __UINT32_TYPE__ unsigned int
 // OPENBSD:#define __UINT64_TYPE__ long long unsigned int
@@ -1912,7 +1912,7 @@
 // WEBASSEMBLY-NEXT:#define __PTRDIFF_FMTi__ "li"
 // WEBASSEMBLY32-NEXT:#define __PTRDIFF_MAX__ 2147483647L
 // WEBASSEMBLY64-NEXT:#define __PTRDIFF_MAX__ 9223372036854775807L
-// WEBASSEMBLY-NEXT:#define __PTRDIFF_TYPE__ long int
+// WEBASSEMBLY-NEXT:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // WEBASSEMBLY32-NEXT:#define __PTRDIFF_WIDTH__ 32
 // WEBASSEMBLY64-NEXT:#define __PTRDIFF_WIDTH__ 64
 // WEBASSEMBLY-NOT:#define __REGISTER_PREFIX__
@@ -1946,7 +1946,7 @@
 // WEBASSEMBLY-NEXT:#define __SIZE_FMTx__ "lx"
 // WEBASSEMBLY32-NEXT:#define __SIZE_MAX__ 4294967295UL
 // WEBASSEMBLY64-NEXT:#define __SIZE_MAX__ 18446744073709551615UL
-// WEBASSEMBLY-NEXT:#define __SIZE_TYPE__ long unsigned int
+// WEBASSEMBLY-NEXT:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // WEBASSEMBLY32-NEXT:#define __SIZE_WIDTH__ 32
 // WEBASSEMBLY64-NEXT:#define __SIZE_WIDTH__ 64
 // WEBASSEMBLY-NEXT:#define __STDC_EMBED_EMPTY__ 2
@@ -2227,7 +2227,7 @@
 // AVR:#define __ORDER_PDP_ENDIAN__ 3412
 // AVR:#define __PRAGMA_REDEFINE_EXTNAME 1
 // AVR:#define __PTRDIFF_MAX__ 32767
-// AVR:#define __PTRDIFF_TYPE__ int
+// AVR:#define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // AVR:#define __SCHAR_MAX__ 127
 // AVR:#define __SHRT_MAX__ 32767
 // AVR:#define __SIG_ATOMIC_MAX__ 127
@@ -2245,7 +2245,7 @@
 // AVR:#define __SIZEOF_WCHAR_T__ 2
 // AVR:#define __SIZEOF_WINT_T__ 2
 // AVR:#define __SIZE_MAX__ 65535U
-// AVR:#define __SIZE_TYPE__ unsigned int
+// AVR:#define __SIZE_TYPE__ __typeof(sizeof(0))
 // AVR:#define __STDC__ 1
 // AVR:#define __UINT16_MAX__ 65535U
 // AVR:#define __UINT16_TYPE__ unsigned int
@@ -2336,12 +2336,12 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix MACOS-64 %s
 
 // MACOS-32: #define __INTPTR_TYPE__ long int
-// MACOS-32: #define __PTRDIFF_TYPE__ int
-// MACOS-32: #define __SIZE_TYPE__ long unsigned int
+// MACOS-32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// MACOS-32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // MACOS-64: #define __INTPTR_TYPE__ long int
-// MACOS-64: #define __PTRDIFF_TYPE__ long int
-// MACOS-64: #define __SIZE_TYPE__ long unsigned int
+// MACOS-64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// MACOS-64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // RUN: %clang_cc1 -triple i386-apple-ios-simulator -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix IOS-32 %s
 // RUN: %clang_cc1 -triple armv7-apple-ios -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix IOS-32 %s
@@ -2349,12 +2349,12 @@
 // RUN: %clang_cc1 -triple arm64-apple-ios -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix IOS-64 %s
 
 // IOS-32: #define __INTPTR_TYPE__ long int
-// IOS-32: #define __PTRDIFF_TYPE__ int
-// IOS-32: #define __SIZE_TYPE__ long unsigned int
+// IOS-32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// IOS-32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // IOS-64: #define __INTPTR_TYPE__ long int
-// IOS-64: #define __PTRDIFF_TYPE__ long int
-// IOS-64: #define __SIZE_TYPE__ long unsigned int
+// IOS-64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// IOS-64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // RUN: %clang_cc1 -triple i386-apple-tvos-simulator -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix TVOS-32 %s
 // RUN: %clang_cc1 -triple armv7-apple-tvos -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix TVOS-32 %s
@@ -2362,12 +2362,12 @@
 // RUN: %clang_cc1 -triple arm64-apple-tvos -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix TVOS-64 %s
 
 // TVOS-32: #define __INTPTR_TYPE__ long int
-// TVOS-32: #define __PTRDIFF_TYPE__ int
-// TVOS-32: #define __SIZE_TYPE__ long unsigned int
+// TVOS-32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// TVOS-32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // TVOS-64: #define __INTPTR_TYPE__ long int
-// TVOS-64: #define __PTRDIFF_TYPE__ long int
-// TVOS-64: #define __SIZE_TYPE__ long unsigned int
+// TVOS-64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// TVOS-64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // RUN: %clang_cc1 -triple i386-apple-watchos-simulator -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix WATCHOS-32 %s
 // RUN: %clang_cc1 -triple armv7k-apple-watchos -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix WATCHOS-64 %s
@@ -2375,23 +2375,23 @@
 // RUN: %clang_cc1 -triple arm64-apple-watchos -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix WATCHOS-64 %s
 
 // WATCHOS-32: #define __INTPTR_TYPE__ long int
-// WATCHOS-32: #define __PTRDIFF_TYPE__ int
-// WATCHOS-32: #define __SIZE_TYPE__ long unsigned int
+// WATCHOS-32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// WATCHOS-32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // WATCHOS-64: #define __INTPTR_TYPE__ long int
-// WATCHOS-64: #define __PTRDIFF_TYPE__ long int
-// WATCHOS-64: #define __SIZE_TYPE__ long unsigned int
+// WATCHOS-64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// WATCHOS-64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // RUN: %clang_cc1 -triple armv7-apple-none-macho -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix ARM-DARWIN-BAREMETAL-32 %s
 // RUN: %clang_cc1 -triple arm64-apple-none-macho -ffreestanding -dM -E /dev/null -o - | FileCheck -match-full-lines -check-prefix ARM-DARWIN-BAREMETAL-64 %s
 
 // ARM-DARWIN-BAREMETAL-32: #define __INTPTR_TYPE__ long int
-// ARM-DARWIN-BAREMETAL-32: #define __PTRDIFF_TYPE__ int
-// ARM-DARWIN-BAREMETAL-32: #define __SIZE_TYPE__ long unsigned int
+// ARM-DARWIN-BAREMETAL-32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// ARM-DARWIN-BAREMETAL-32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // ARM-DARWIN-BAREMETAL-64: #define __INTPTR_TYPE__ long int
-// ARM-DARWIN-BAREMETAL-64: #define __PTRDIFF_TYPE__ long int
-// ARM-DARWIN-BAREMETAL-64: #define __SIZE_TYPE__ long unsigned int
+// ARM-DARWIN-BAREMETAL-64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
+// ARM-DARWIN-BAREMETAL-64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 
 // RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=riscv32 < /dev/null \
 // RUN:   | FileCheck -match-full-lines -check-prefix=RISCV32 %s
@@ -2530,7 +2530,7 @@
 // RISCV32: #define __POINTER_WIDTH__ 32
 // RISCV32: #define __PRAGMA_REDEFINE_EXTNAME 1
 // RISCV32: #define __PTRDIFF_MAX__ 2147483647
-// RISCV32: #define __PTRDIFF_TYPE__ int
+// RISCV32: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // RISCV32: #define __PTRDIFF_WIDTH__ 32
 // RISCV32: #define __SCHAR_MAX__ 127
 // RISCV32: #define __SHRT_MAX__ 32767
@@ -2550,7 +2550,7 @@
 // RISCV32: #define __SIZEOF_WCHAR_T__ 4
 // RISCV32: #define __SIZEOF_WINT_T__ 4
 // RISCV32: #define __SIZE_MAX__ 4294967295U
-// RISCV32: #define __SIZE_TYPE__ unsigned int
+// RISCV32: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // RISCV32: #define __SIZE_WIDTH__ 32
 // RISCV32: #define __STDC_HOSTED__ 0
 // RISCV32: #define __STDC_UTF_16__ 1
@@ -2754,7 +2754,7 @@
 // RISCV64: #define __POINTER_WIDTH__ 64
 // RISCV64: #define __PRAGMA_REDEFINE_EXTNAME 1
 // RISCV64: #define __PTRDIFF_MAX__ 9223372036854775807L
-// RISCV64: #define __PTRDIFF_TYPE__ long int
+// RISCV64: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // RISCV64: #define __PTRDIFF_WIDTH__ 64
 // RISCV64: #define __SCHAR_MAX__ 127
 // RISCV64: #define __SHRT_MAX__ 32767
@@ -2773,7 +2773,7 @@
 // RISCV64: #define __SIZEOF_WCHAR_T__ 4
 // RISCV64: #define __SIZEOF_WINT_T__ 4
 // RISCV64: #define __SIZE_MAX__ 18446744073709551615UL
-// RISCV64: #define __SIZE_TYPE__ long unsigned int
+// RISCV64: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // RISCV64: #define __SIZE_WIDTH__ 64
 // RISCV64: #define __STDC_HOSTED__ 0
 // RISCV64: #define __STDC_UTF_16__ 1
@@ -3019,7 +3019,7 @@
 // XTENSA: #define __POINTER_WIDTH__ 32
 // XTENSA: #define __PRAGMA_REDEFINE_EXTNAME 1
 // XTENSA: #define __PTRDIFF_MAX__ 2147483647
-// XTENSA: #define __PTRDIFF_TYPE__ int
+// XTENSA: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // XTENSA: #define __PTRDIFF_WIDTH__ 32
 // XTENSA: #define __SCHAR_MAX__ 127
 // XTENSA: #define __SHRT_MAX__ 32767
@@ -3039,7 +3039,7 @@
 // XTENSA: #define __SIZEOF_WCHAR_T__ 4
 // XTENSA: #define __SIZEOF_WINT_T__ 4
 // XTENSA: #define __SIZE_MAX__ 4294967295U
-// XTENSA: #define __SIZE_TYPE__ unsigned int
+// XTENSA: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // XTENSA: #define __SIZE_WIDTH__ 32
 // XTENSA: #define __STDC_EMBED_EMPTY__ 2
 // XTENSA: #define __STDC_EMBED_FOUND__ 1
diff --git a/clang/test/Preprocessor/woa-defaults.c b/clang/test/Preprocessor/woa-defaults.c
index 97578239396ac..d58636781e8e0 100644
--- a/clang/test/Preprocessor/woa-defaults.c
+++ b/clang/test/Preprocessor/woa-defaults.c
@@ -15,7 +15,7 @@
 // CHECK: #define __ARM_PCS_VFP 1
 // CHECK: #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
 // CHECK: #define __INTPTR_TYPE__ int
-// CHECK: #define __PTRDIFF_TYPE__ int
+// CHECK: #define __PTRDIFF_TYPE__ __typeof((int*)0-(int*)0)
 // CHECK: #define __SIZEOF_DOUBLE__ 8
 // CHECK: #define __SIZEOF_FLOAT__ 4
 // CHECK: #define __SIZEOF_INT__ 4
@@ -28,7 +28,7 @@
 // CHECK: #define __SIZEOF_SIZE_T__ 4
 // CHECK: #define __SIZEOF_WCHAR_T__ 2
 // CHECK: #define __SIZEOF_WINT_T__ 2
-// CHECK: #define __SIZE_TYPE__ unsigned int
+// CHECK: #define __SIZE_TYPE__ __typeof(sizeof(0))
 // CHECK: #define __UINTPTR_TYPE__ unsigned int
 
 // CHECK-NOT: __THUMB_INTERWORK__
diff --git a/clang/test/Sema/warn-bad-function-cast.c b/clang/test/Sema/warn-bad-function-cast.c
index 0172c9b37c97d..b5d5acc996631 100644
--- a/clang/test/Sema/warn-bad-function-cast.c
+++ b/clang/test/Sema/warn-bad-function-cast.c
@@ -13,6 +13,9 @@ char *pf1(void);
 int *pf2(void);
 _Fract ff1(void);
 
+typedef __SIZE_TYPE__ size_t;
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+
 void
 foo(void)
 {
@@ -46,8 +49,8 @@ foo(void)
   (double)cf(); /* expected-warning {{cast from function call of type '_Complex double' to non-matching type 'double'}} */
   (int)ef(); /* expected-warning {{cast from function call of type 'enum e' to non-matching type 'int'}} */
   (int)bf(); /* expected-warning {{cast from function call of type '_Bool' to non-matching type 'int'}} */
-  (__SIZE_TYPE__)pf1(); /* expected-warning {{cast from function call of type 'char *' to non-matching type 'unsigned long'}} */
-  (__PTRDIFF_TYPE__)pf2(); /* expected-warning {{cast from function call of type 'int *' to non-matching type 'long'}} */
+  (size_t)pf1(); /* expected-warning {{cast from function call of type 'char *' to non-matching type 'size_t' (aka 'unsigned long')}} */
+  (ptrdiff_t)pf2(); /* expected-warning {{cast from function call of type 'int *' to non-matching type 'ptrdiff_t' (aka 'long')}} */
   (_Fract) if1();          /* expected-warning{{cast from function call of type 'int' to non-matching type '_Fract'}} */
   (int)ff1();              /* expected-warning{{cast from function call of type '_Fract' to non-matching type 'int'}} */
 }

>From 085cf658e2693e37e80a56802a1340980938cdcd Mon Sep 17 00:00:00 2001
From: YexuanXiao <bizwen at nykz.org>
Date: Sun, 31 Aug 2025 10:57:31 +0800
Subject: [PATCH 2/2] Add tests

---
 clang/test/AST/ast-dump-types-json.cpp        | 502 ++++++++++++++++++
 .../std-c-library-functions-arg-constraints.c |   6 +-
 2 files changed, 506 insertions(+), 2 deletions(-)

diff --git a/clang/test/AST/ast-dump-types-json.cpp b/clang/test/AST/ast-dump-types-json.cpp
index aac602780e8c0..e9fc3b3881801 100644
--- a/clang/test/AST/ast-dump-types-json.cpp
+++ b/clang/test/AST/ast-dump-types-json.cpp
@@ -25,6 +25,14 @@ namespace TestNamespaceWithUsingShadowType {
 using ::TestUsingShadowDeclType;
 }
 
+typedef __SIZE_TYPE__ macro_size_t;
+typedef __PTRDIFF_TYPE__ macro_ptrdiff_t;
+typedef __typeof__(sizeof(0)) typeof_size_t;
+typedef __typeof__((int*)0 - (int*)0) typeof_ptrdiff_t;
+
+typedef __typeof__((macro_size_t)0 + (typeof_size_t)0) Test_common_sugar_size_t;
+typedef __typeof__((macro_ptrdiff_t)0 + (typeof_ptrdiff_t)0) Test_common_sugar_ptrdiff_t;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 
 
@@ -557,3 +565,497 @@ using ::TestUsingShadowDeclType;
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "TypedefDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 847,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 33,
+// CHECK-NEXT:   "col": 56,
+// CHECK-NEXT:   "tokLen": 24
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:    "offset": 792,
+// CHECK-NEXT:    "col": 1,
+// CHECK-NEXT:    "tokLen": 7
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:    "offset": 847,
+// CHECK-NEXT:    "col": 56,
+// CHECK-NEXT:    "tokLen": 24
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "Test_common_sugar_size_t",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "desugaredQualType": "unsigned long",
+// CHECK-NEXT:   "qualType": "typeof ((macro_size_t)0 + (typeof_size_t)0)"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:    "id": "0x{{.*}}",
+// CHECK-NEXT:    "kind": "TypeOfExprType",
+// CHECK-NEXT:    "type": {
+// CHECK-NEXT:     "qualType": "typeof ((macro_size_t)0 + (typeof_size_t)0)"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    "inner": [
+// CHECK-NEXT:     {
+// CHECK-NEXT:      "id": "0x{{.*}}",
+// CHECK-NEXT:      "kind": "ParenExpr",
+// CHECK-NEXT:      "range": {
+// CHECK-NEXT:       "begin": {
+// CHECK-NEXT:        "offset": 810,
+// CHECK-NEXT:        "col": 19,
+// CHECK-NEXT:        "tokLen": 1
+// CHECK-NEXT:       },
+// CHECK-NEXT:       "end": {
+// CHECK-NEXT:        "offset": 845,
+// CHECK-NEXT:        "col": 54,
+// CHECK-NEXT:        "tokLen": 1
+// CHECK-NEXT:       }
+// CHECK-NEXT:      },
+// CHECK-NEXT:      "type": {
+// CHECK-NEXT:       "desugaredQualType": "unsigned long",
+// CHECK-NEXT:       "qualType": "__size_t"
+// CHECK-NEXT:      },
+// CHECK-NEXT:      "valueCategory": "prvalue",
+// CHECK-NEXT:      "inner": [
+// CHECK-NEXT:       {
+// CHECK-NEXT:        "id": "0x{{.*}}",
+// CHECK-NEXT:        "kind": "BinaryOperator",
+// CHECK-NEXT:        "range": {
+// CHECK-NEXT:         "begin": {
+// CHECK-NEXT:          "offset": 811,
+// CHECK-NEXT:          "col": 20,
+// CHECK-NEXT:          "tokLen": 1
+// CHECK-NEXT:         },
+// CHECK-NEXT:         "end": {
+// CHECK-NEXT:          "offset": 844,
+// CHECK-NEXT:          "col": 53,
+// CHECK-NEXT:          "tokLen": 1
+// CHECK-NEXT:         }
+// CHECK-NEXT:        },
+// CHECK-NEXT:        "type": {
+// CHECK-NEXT:         "desugaredQualType": "unsigned long",
+// CHECK-NEXT:         "qualType": "__size_t"
+// CHECK-NEXT:        },
+// CHECK-NEXT:        "valueCategory": "prvalue",
+// CHECK-NEXT:        "opcode": "+",
+// CHECK-NEXT:        "inner": [
+// CHECK-NEXT:         {
+// CHECK-NEXT:          "id": "0x{{.*}}",
+// CHECK-NEXT:          "kind": "CStyleCastExpr",
+// CHECK-NEXT:          "range": {
+// CHECK-NEXT:           "begin": {
+// CHECK-NEXT:            "offset": 811,
+// CHECK-NEXT:            "col": 20,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           },
+// CHECK-NEXT:           "end": {
+// CHECK-NEXT:            "offset": 825,
+// CHECK-NEXT:            "col": 34,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           }
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "type": {
+// CHECK-NEXT:           "desugaredQualType": "unsigned long",
+// CHECK-NEXT:           "qualType": "macro_size_t",
+// CHECK-NEXT:           "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "valueCategory": "prvalue",
+// CHECK-NEXT:          "castKind": "NoOp",
+// CHECK-NEXT:          "inner": [
+// CHECK-NEXT:           {
+// CHECK-NEXT:            "id": "0x{{.*}}",
+// CHECK-NEXT:            "kind": "ImplicitCastExpr",
+// CHECK-NEXT:            "range": {
+// CHECK-NEXT:             "begin": {
+// CHECK-NEXT:              "offset": 825,
+// CHECK-NEXT:              "col": 34,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             },
+// CHECK-NEXT:             "end": {
+// CHECK-NEXT:              "offset": 825,
+// CHECK-NEXT:              "col": 34,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             }
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "type": {
+// CHECK-NEXT:             "desugaredQualType": "unsigned long",
+// CHECK-NEXT:             "qualType": "macro_size_t",
+// CHECK-NEXT:             "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "valueCategory": "prvalue",
+// CHECK-NEXT:            "castKind": "IntegralCast",
+// CHECK-NEXT:            "isPartOfExplicitCast": true,
+// CHECK-NEXT:            "inner": [
+// CHECK-NEXT:             {
+// CHECK-NEXT:              "id": "0x{{.*}}",
+// CHECK-NEXT:              "kind": "IntegerLiteral",
+// CHECK-NEXT:              "range": {
+// CHECK-NEXT:               "begin": {
+// CHECK-NEXT:                "offset": 825,
+// CHECK-NEXT:                "col": 34,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               },
+// CHECK-NEXT:               "end": {
+// CHECK-NEXT:                "offset": 825,
+// CHECK-NEXT:                "col": 34,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               }
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "type": {
+// CHECK-NEXT:               "qualType": "int"
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "valueCategory": "prvalue",
+// CHECK-NEXT:              "value": "0"
+// CHECK-NEXT:             }
+// CHECK-NEXT:            ]
+// CHECK-NEXT:           }
+// CHECK-NEXT:          ]
+// CHECK-NEXT:         },
+// CHECK-NEXT:         {
+// CHECK-NEXT:          "id": "0x{{.*}}",
+// CHECK-NEXT:          "kind": "CStyleCastExpr",
+// CHECK-NEXT:          "range": {
+// CHECK-NEXT:           "begin": {
+// CHECK-NEXT:            "offset": 829,
+// CHECK-NEXT:            "col": 38,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           },
+// CHECK-NEXT:           "end": {
+// CHECK-NEXT:            "offset": 844,
+// CHECK-NEXT:            "col": 53,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           }
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "type": {
+// CHECK-NEXT:           "desugaredQualType": "unsigned long",
+// CHECK-NEXT:           "qualType": "typeof_size_t",
+// CHECK-NEXT:           "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "valueCategory": "prvalue",
+// CHECK-NEXT:          "castKind": "NoOp",
+// CHECK-NEXT:          "inner": [
+// CHECK-NEXT:           {
+// CHECK-NEXT:            "id": "0x{{.*}}",
+// CHECK-NEXT:            "kind": "ImplicitCastExpr",
+// CHECK-NEXT:            "range": {
+// CHECK-NEXT:             "begin": {
+// CHECK-NEXT:              "offset": 844,
+// CHECK-NEXT:              "col": 53,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             },
+// CHECK-NEXT:             "end": {
+// CHECK-NEXT:              "offset": 844,
+// CHECK-NEXT:              "col": 53,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             }
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "type": {
+// CHECK-NEXT:             "desugaredQualType": "unsigned long",
+// CHECK-NEXT:             "qualType": "typeof_size_t",
+// CHECK-NEXT:             "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "valueCategory": "prvalue",
+// CHECK-NEXT:            "castKind": "IntegralCast",
+// CHECK-NEXT:            "isPartOfExplicitCast": true,
+// CHECK-NEXT:            "inner": [
+// CHECK-NEXT:             {
+// CHECK-NEXT:              "id": "0x{{.*}}",
+// CHECK-NEXT:              "kind": "IntegerLiteral",
+// CHECK-NEXT:              "range": {
+// CHECK-NEXT:               "begin": {
+// CHECK-NEXT:                "offset": 844,
+// CHECK-NEXT:                "col": 53,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               },
+// CHECK-NEXT:               "end": {
+// CHECK-NEXT:                "offset": 844,
+// CHECK-NEXT:                "col": 53,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               }
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "type": {
+// CHECK-NEXT:               "qualType": "int"
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "valueCategory": "prvalue",
+// CHECK-NEXT:              "value": "0"
+// CHECK-NEXT:             }
+// CHECK-NEXT:            ]
+// CHECK-NEXT:           }
+// CHECK-NEXT:          ]
+// CHECK-NEXT:         }
+// CHECK-NEXT:        ]
+// CHECK-NEXT:       }
+// CHECK-NEXT:      ]
+// CHECK-NEXT:     },
+// CHECK-NEXT:     {
+// CHECK-NEXT:      "id": "0x{{.*}}",
+// CHECK-NEXT:      "kind": "PredefinedSugarType",
+// CHECK-NEXT:      "type": {
+// CHECK-NEXT:       "qualType": "__size_t"
+// CHECK-NEXT:      },
+// CHECK-NEXT:      "inner": [
+// CHECK-NEXT:       {
+// CHECK-NEXT:        "id": "0x{{.*}}",
+// CHECK-NEXT:        "kind": "BuiltinType",
+// CHECK-NEXT:        "type": {
+// CHECK-NEXT:         "qualType": "unsigned long"
+// CHECK-NEXT:        }
+// CHECK-NEXT:       }
+// CHECK-NEXT:      ]
+// CHECK-NEXT:     }
+// CHECK-NEXT:    ]
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "TypedefDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 934,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 34,
+// CHECK-NEXT:   "col": 62,
+// CHECK-NEXT:   "tokLen": 27
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:    "offset": 873,
+// CHECK-NEXT:    "col": 1,
+// CHECK-NEXT:    "tokLen": 7
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:    "offset": 934,
+// CHECK-NEXT:    "col": 62,
+// CHECK-NEXT:    "tokLen": 27
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "Test_common_sugar_ptrdiff_t",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "desugaredQualType": "long",
+// CHECK-NEXT:   "qualType": "typeof ((macro_ptrdiff_t)0 + (typeof_ptrdiff_t)0)"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:    "id": "0x{{.*}}",
+// CHECK-NEXT:    "kind": "TypeOfExprType",
+// CHECK-NEXT:    "type": {
+// CHECK-NEXT:     "qualType": "typeof ((macro_ptrdiff_t)0 + (typeof_ptrdiff_t)0)"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    "inner": [
+// CHECK-NEXT:     {
+// CHECK-NEXT:      "id": "0x{{.*}}",
+// CHECK-NEXT:      "kind": "ParenExpr",
+// CHECK-NEXT:      "range": {
+// CHECK-NEXT:       "begin": {
+// CHECK-NEXT:        "offset": 891,
+// CHECK-NEXT:        "col": 19,
+// CHECK-NEXT:        "tokLen": 1
+// CHECK-NEXT:       },
+// CHECK-NEXT:       "end": {
+// CHECK-NEXT:        "offset": 932,
+// CHECK-NEXT:        "col": 60,
+// CHECK-NEXT:        "tokLen": 1
+// CHECK-NEXT:       }
+// CHECK-NEXT:      },
+// CHECK-NEXT:      "type": {
+// CHECK-NEXT:       "desugaredQualType": "long",
+// CHECK-NEXT:       "qualType": "__ptrdiff_t"
+// CHECK-NEXT:      },
+// CHECK-NEXT:      "valueCategory": "prvalue",
+// CHECK-NEXT:      "inner": [
+// CHECK-NEXT:       {
+// CHECK-NEXT:        "id": "0x{{.*}}",
+// CHECK-NEXT:        "kind": "BinaryOperator",
+// CHECK-NEXT:        "range": {
+// CHECK-NEXT:         "begin": {
+// CHECK-NEXT:          "offset": 892,
+// CHECK-NEXT:          "col": 20,
+// CHECK-NEXT:          "tokLen": 1
+// CHECK-NEXT:         },
+// CHECK-NEXT:         "end": {
+// CHECK-NEXT:          "offset": 931,
+// CHECK-NEXT:          "col": 59,
+// CHECK-NEXT:          "tokLen": 1
+// CHECK-NEXT:         }
+// CHECK-NEXT:        },
+// CHECK-NEXT:        "type": {
+// CHECK-NEXT:         "desugaredQualType": "long",
+// CHECK-NEXT:         "qualType": "__ptrdiff_t"
+// CHECK-NEXT:        },
+// CHECK-NEXT:        "valueCategory": "prvalue",
+// CHECK-NEXT:        "opcode": "+",
+// CHECK-NEXT:        "inner": [
+// CHECK-NEXT:         {
+// CHECK-NEXT:          "id": "0x{{.*}}",
+// CHECK-NEXT:          "kind": "CStyleCastExpr",
+// CHECK-NEXT:          "range": {
+// CHECK-NEXT:           "begin": {
+// CHECK-NEXT:            "offset": 892,
+// CHECK-NEXT:            "col": 20,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           },
+// CHECK-NEXT:           "end": {
+// CHECK-NEXT:            "offset": 909,
+// CHECK-NEXT:            "col": 37,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           }
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "type": {
+// CHECK-NEXT:           "desugaredQualType": "long",
+// CHECK-NEXT:           "qualType": "macro_ptrdiff_t",
+// CHECK-NEXT:           "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "valueCategory": "prvalue",
+// CHECK-NEXT:          "castKind": "NoOp",
+// CHECK-NEXT:          "inner": [
+// CHECK-NEXT:           {
+// CHECK-NEXT:            "id": "0x{{.*}}",
+// CHECK-NEXT:            "kind": "ImplicitCastExpr",
+// CHECK-NEXT:            "range": {
+// CHECK-NEXT:             "begin": {
+// CHECK-NEXT:              "offset": 909,
+// CHECK-NEXT:              "col": 37,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             },
+// CHECK-NEXT:             "end": {
+// CHECK-NEXT:              "offset": 909,
+// CHECK-NEXT:              "col": 37,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             }
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "type": {
+// CHECK-NEXT:             "desugaredQualType": "long",
+// CHECK-NEXT:             "qualType": "macro_ptrdiff_t",
+// CHECK-NEXT:             "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "valueCategory": "prvalue",
+// CHECK-NEXT:            "castKind": "IntegralCast",
+// CHECK-NEXT:            "isPartOfExplicitCast": true,
+// CHECK-NEXT:            "inner": [
+// CHECK-NEXT:             {
+// CHECK-NEXT:              "id": "0x{{.*}}",
+// CHECK-NEXT:              "kind": "IntegerLiteral",
+// CHECK-NEXT:              "range": {
+// CHECK-NEXT:               "begin": {
+// CHECK-NEXT:                "offset": 909,
+// CHECK-NEXT:                "col": 37,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               },
+// CHECK-NEXT:               "end": {
+// CHECK-NEXT:                "offset": 909,
+// CHECK-NEXT:                "col": 37,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               }
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "type": {
+// CHECK-NEXT:               "qualType": "int"
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "valueCategory": "prvalue",
+// CHECK-NEXT:              "value": "0"
+// CHECK-NEXT:             }
+// CHECK-NEXT:            ]
+// CHECK-NEXT:           }
+// CHECK-NEXT:          ]
+// CHECK-NEXT:         },
+// CHECK-NEXT:         {
+// CHECK-NEXT:          "id": "0x{{.*}}",
+// CHECK-NEXT:          "kind": "CStyleCastExpr",
+// CHECK-NEXT:          "range": {
+// CHECK-NEXT:           "begin": {
+// CHECK-NEXT:            "offset": 913,
+// CHECK-NEXT:            "col": 41,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           },
+// CHECK-NEXT:           "end": {
+// CHECK-NEXT:            "offset": 931,
+// CHECK-NEXT:            "col": 59,
+// CHECK-NEXT:            "tokLen": 1
+// CHECK-NEXT:           }
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "type": {
+// CHECK-NEXT:           "desugaredQualType": "long",
+// CHECK-NEXT:           "qualType": "typeof_ptrdiff_t",
+// CHECK-NEXT:           "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:          },
+// CHECK-NEXT:          "valueCategory": "prvalue",
+// CHECK-NEXT:          "castKind": "NoOp",
+// CHECK-NEXT:          "inner": [
+// CHECK-NEXT:           {
+// CHECK-NEXT:            "id": "0x{{.*}}",
+// CHECK-NEXT:            "kind": "ImplicitCastExpr",
+// CHECK-NEXT:            "range": {
+// CHECK-NEXT:             "begin": {
+// CHECK-NEXT:              "offset": 931,
+// CHECK-NEXT:              "col": 59,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             },
+// CHECK-NEXT:             "end": {
+// CHECK-NEXT:              "offset": 931,
+// CHECK-NEXT:              "col": 59,
+// CHECK-NEXT:              "tokLen": 1
+// CHECK-NEXT:             }
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "type": {
+// CHECK-NEXT:             "desugaredQualType": "long",
+// CHECK-NEXT:             "qualType": "typeof_ptrdiff_t",
+// CHECK-NEXT:             "typeAliasDeclId": "0x{{.*}}"
+// CHECK-NEXT:            },
+// CHECK-NEXT:            "valueCategory": "prvalue",
+// CHECK-NEXT:            "castKind": "IntegralCast",
+// CHECK-NEXT:            "isPartOfExplicitCast": true,
+// CHECK-NEXT:            "inner": [
+// CHECK-NEXT:             {
+// CHECK-NEXT:              "id": "0x{{.*}}",
+// CHECK-NEXT:              "kind": "IntegerLiteral",
+// CHECK-NEXT:              "range": {
+// CHECK-NEXT:               "begin": {
+// CHECK-NEXT:                "offset": 931,
+// CHECK-NEXT:                "col": 59,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               },
+// CHECK-NEXT:               "end": {
+// CHECK-NEXT:                "offset": 931,
+// CHECK-NEXT:                "col": 59,
+// CHECK-NEXT:                "tokLen": 1
+// CHECK-NEXT:               }
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "type": {
+// CHECK-NEXT:               "qualType": "int"
+// CHECK-NEXT:              },
+// CHECK-NEXT:              "valueCategory": "prvalue",
+// CHECK-NEXT:              "value": "0"
+// CHECK-NEXT:             }
+// CHECK-NEXT:            ]
+// CHECK-NEXT:           }
+// CHECK-NEXT:          ]
+// CHECK-NEXT:         }
+// CHECK-NEXT:        ]
+// CHECK-NEXT:       }
+// CHECK-NEXT:      ]
+// CHECK-NEXT:     },
+// CHECK-NEXT:     {
+// CHECK-NEXT:      "id": "0x{{.*}}",
+// CHECK-NEXT:      "kind": "PredefinedSugarType",
+// CHECK-NEXT:      "type": {
+// CHECK-NEXT:       "qualType": "__ptrdiff_t"
+// CHECK-NEXT:      },
+// CHECK-NEXT:      "inner": [
+// CHECK-NEXT:       {
+// CHECK-NEXT:        "id": "0x{{.*}}",
+// CHECK-NEXT:        "kind": "BuiltinType",
+// CHECK-NEXT:        "type": {
+// CHECK-NEXT:         "qualType": "long"
+// CHECK-NEXT:        }
+// CHECK-NEXT:       }
+// CHECK-NEXT:      ]
+// CHECK-NEXT:     }
+// CHECK-NEXT:    ]
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
diff --git a/clang/test/Analysis/std-c-library-functions-arg-constraints.c b/clang/test/Analysis/std-c-library-functions-arg-constraints.c
index 0b817dda98c72..4d07b8e220125 100644
--- a/clang/test/Analysis/std-c-library-functions-arg-constraints.c
+++ b/clang/test/Analysis/std-c-library-functions-arg-constraints.c
@@ -323,7 +323,8 @@ void test_buf_size_concrete_with_multiplication(void) {
 void test_buf_size_symbolic_with_multiplication(size_t s) {
   short buf[3];
   __buf_size_arg_constraint_mul(buf, s, sizeof(short));
-  clang_analyzer_eval(s * sizeof(short) <= 6); // \
+  // FIXME: remove the conversion to unsigned long will cause the test to fail.
+  clang_analyzer_eval((unsigned long)s * sizeof(short) <= 6); // \
   // report-warning{{TRUE}} \
   // bugpath-warning{{TRUE}} \
   // bugpath-note{{TRUE}}
@@ -331,7 +332,8 @@ void test_buf_size_symbolic_with_multiplication(size_t s) {
 void test_buf_size_symbolic_and_offset_with_multiplication(size_t s) {
   short buf[3];
   __buf_size_arg_constraint_mul(buf + 1, s, sizeof(short));
-  clang_analyzer_eval(s * sizeof(short) <= 4); // \
+  // FIXME: remove the conversion to unsigned long will cause the test to fail.
+  clang_analyzer_eval((unsigned long)s * sizeof(short) <= 4); // \
   // report-warning{{TRUE}} \
   // bugpath-warning{{TRUE}} \
   // bugpath-note{{TRUE}}



More information about the cfe-commits mailing list