240 lines · c
1// RUN: rm -fR %t2// RUN: %clang_cc1 -fsyntax-only -verify=c99 -std=c99 %s3// RUN: %clang_cc1 -fsyntax-only -verify=c23 -std=c23 %s4// RUN: %clang_cc1 -fsyntax-only -verify=c99-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -std=c99 %s5// RUN: %clang_cc1 -fsyntax-only -verify=c23-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -std=c23 %s6 7// Use C99 to verify that __need_ can be used to get types that wouldn't normally be available.8 9struct astruct { char member; };10 11ptrdiff_t p0; // c99-error{{unknown type name 'ptrdiff_t'}} c23-error{{unknown type}} \12 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}13size_t s0; // c99-error{{unknown type name 'size_t'}} c23-error{{unknown type}} \14 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}15rsize_t r0; // c99-error{{unknown type name 'rsize_t'}} c23-error{{unknown type}} \16 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}17wchar_t wc0; // c99-error{{unknown type name 'wchar_t'}} c23-error{{unknown type}} \18 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}19void *v0 = NULL; // c99-error{{use of undeclared identifier 'NULL'}} c23-error{{undeclared identifier}} \20 c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}21nullptr_t n0; // c99-error{{unknown type name 'nullptr_t'}} c23-error{{unknown type}} \22 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}23static void f0(void) { unreachable(); } // c99-error{{call to undeclared function 'unreachable'}} c23-error{{undeclared identifier 'unreachable'}} \24 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}25max_align_t m0; // c99-error{{unknown type name 'max_align_t'}} c23-error{{unknown type}} \26 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}27size_t o0 = offsetof(struct astruct, member); // c99-error{{unknown type name 'size_t'}} c99-error{{call to undeclared function 'offsetof'}} c99-error{{expected expression}} c99-error{{use of undeclared identifier 'member'}} \28 c23-error{{unknown type name 'size_t'}} c23-error{{undeclared identifier 'offsetof'}} c23-error{{expected expression}} c23-error{{use of undeclared identifier 'member'}} \29 c99-modules-error{{unknown type}} c99-modules-error{{undeclared function}} c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \30 c23-modules-error{{unknown type}} c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}31wint_t wi0; // c99-error{{unknown type name 'wint_t'}} c23-error{{unknown type}} \32 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}33 34#define __need_ptrdiff_t35#include <stddef.h>36 37ptrdiff_t p1;38size_t s1; // c99-error{{unknown type}} c23-error{{unknown type}} \39 c99-modules-error{{'size_t' must be declared before it is used}} c23-modules-error{{must be declared}} \40 c99-modules-note@__stddef_size_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_size_t.h:*{{declaration here is not visible}}41rsize_t r1; // c99-error{{unknown type}} c23-error{{unknown type}} \42 c99-modules-error{{'rsize_t' must be declared before it is used}} c23-modules-error{{must be declared}} \43 c99-modules-note@__stddef_rsize_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_rsize_t.h:*{{declaration here is not visible}}44wchar_t wc1; // c99-error{{unknown type}} c23-error{{unknown type}} \45 c99-modules-error{{'wchar_t' must be declared before it is used}} c23-modules-error{{must be declared}} \46 c99-modules-note@__stddef_wchar_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_wchar_t.h:*{{declaration here is not visible}}47void *v1 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \48 c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}49nullptr_t n1; // c99-error{{unknown type}} c23-error{{unknown type}} \50 c99-modules-error{{unknown type}} c23-modules-error{{'nullptr_t' must be declared before it is used}} \51 c23-modules-note@__stddef_nullptr_t.h:*{{declaration here is not visible}}52static void f1(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \53 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}54max_align_t m1; // c99-error{{unknown type}} c23-error{{unknown type}} \55 c99-modules-error{{'max_align_t' must be declared before it is used}} c23-modules-error{{must be declared}} \56 c99-modules-note@__stddef_max_align_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_max_align_t.h:*{{declaration here is not visible}}57size_t o1 = offsetof(struct astruct, member); // c99-error{{unknown type}} c99-error{{expected expression}} c99-error{{undeclared identifier}} \58 c23-error{{unknown type}} c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \59 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \60 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}61wint_t wi1; // c99-error{{unknown type}} c23-error{{unknown type}} \62 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}63 64// The "must be declared before used" errors are only emitted the first time a65// known-but-not-visible type is seen. At this point the _Builtin_stddef module66// has been built and all of the types tried, so most of the errors won't be67// repeated below in modules. The types still aren't available, just the errors68// aren't repeated. e.g. rsize_t still isn't available, if r1 above got deleted,69// its error would move to r2 below.70 71#define __need_size_t72#include <stddef.h>73 74ptrdiff_t p2;75size_t s2;76rsize_t r2; // c99-error{{unknown type}} c23-error{{unknown type}}77 // c99-note@__stddef_size_t.h:*{{'size_t' declared here}} c23-note@__stddef_size_t.h:*{{'size_t' declared here}}78wchar_t wc2; // c99-error{{unknown type}} c23-error{{unknown type}}79void *v2 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \80 c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}81nullptr_t n2; // c99-error{{unknown type}} c23-error{{unknown type}} \82 c99-modules-error{{unknown type}}83static void f2(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \84 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}85max_align_t m2; // c99-error{{unknown type}} c23-error{{unknown type}}86size_t o2 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \87 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \88 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \89 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}90wint_t wi2; // c99-error{{unknown type}} c23-error{{unknown type}} \91 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}92 93#define __need_rsize_t94#include <stddef.h>95 96ptrdiff_t p3;97size_t s3;98rsize_t r3;99wchar_t wc3; // c99-error{{unknown type}} c23-error{{unknown type}}100void *v3 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \101 c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}102nullptr_t n3; // c99-error{{unknown type}} c23-error{{unknown type}} \103 c99-modules-error{{unknown type}}104static void f3(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \105 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}106max_align_t m3; // c99-error{{unknown type}} c23-error{{unknown type}}107size_t o3 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \108 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \109 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \110 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}111wint_t wi3; // c99-error{{unknown type}} c23-error{{unknown type}} \112 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}113 114#define __need_wchar_t115#include <stddef.h>116 117ptrdiff_t p4;118size_t s4;119rsize_t r4;120wchar_t wc4;121void *v4 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \122 c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}123nullptr_t n4; // c99-error{{unknown type}} c23-error{{unknown type}} \124 c99-modules-error{{unknown type}}125static void f4(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \126 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}127max_align_t m4; // c99-error{{unknown type}} c23-error{{unknown type}}128size_t o4 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \129 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \130 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \131 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}132wint_t wi4; // c99-error{{unknown type}} c23-error{{unknown type}} \133 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}134 135#define __need_NULL136#include <stddef.h>137 138ptrdiff_t p5;139size_t s5;140rsize_t r5;141wchar_t wc5;142void *v5 = NULL;143nullptr_t n5; // c99-error{{unknown type}} c23-error{{unknown type}} \144 c99-modules-error{{unknown type}}145static void f5(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \146 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}147max_align_t m5; // c99-error{{unknown type}} c23-error{{unknown type}}148size_t o5 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \149 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \150 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \151 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}152wint_t wi5; // c99-error{{unknown type}} c23-error{{unknown type}} \153 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}154 155// nullptr_t doesn't get declared before C23 because its definition156// depends on nullptr.157#define __need_nullptr_t158#include <stddef.h>159 160ptrdiff_t p6;161size_t s6;162rsize_t r6;163wchar_t wc6;164void *v6 = NULL;165nullptr_t n6; // c99-error{{unknown type}} c99-modules-error{{unknown type}}166static void f6(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \167 c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}168max_align_t m6; // c99-error{{unknown type}} c23-error{{unknown type}}169size_t o6 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \170 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \171 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \172 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}173wint_t wi6; // c99-error{{unknown type}} c23-error{{unknown type}} \174 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}175 176#define __need_unreachable177#include <stddef.h>178 179ptrdiff_t p7;180size_t s7;181rsize_t r7;182wchar_t wc7;183void *v7 = NULL;184nullptr_t n7 ; // c99-error{{unknown type}} c99-modules-error{{unknown type}}185static void f7(void) { unreachable(); }186max_align_t m7; // c99-error{{unknown type}} c23-error{{unknown type}}187size_t o7 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \188 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \189 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \190 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}191wint_t wi7; // c99-error{{unknown type}} c23-error{{unknown type}} \192 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}193 194#define __need_max_align_t195#include <stddef.h>196 197ptrdiff_t p8;198size_t s8;199rsize_t r8;200wchar_t wc8;201void *v8 = NULL;202nullptr_t n8; // c99-error{{unknown type}} c99-modules-error{{unknown type}}203static void f8(void) { unreachable(); }204max_align_t m8;205size_t o8 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \206 c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \207 c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \208 c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}209wint_t wi8; // c99-error{{unknown type}} c23-error{{unknown type}} \210 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}211 212#define __need_offsetof213#include <stddef.h>214 215ptrdiff_t p9;216size_t s9;217rsize_t r9;218nullptr_t n9; // c99-error{{unknown type}} c99-modules-error{{unknown type}}219static void f9(void) { unreachable(); }220wchar_t wc9;221void *v9 = NULL;222max_align_t m9;223size_t o9 = offsetof(struct astruct, member);224wint_t wi9; // c99-error{{unknown type}} c23-error{{unknown type}} \225 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}226 227#define __need_wint_t228#include <stddef.h>229 230ptrdiff_t p10;231size_t s10;232rsize_t r10;233wchar_t wc10;234void *v10 = NULL;235nullptr_t n10; // c99-error{{unknown type}} c99-modules-error{{unknown type}}236static void f10(void) { unreachable(); }237max_align_t m10;238size_t o10 = offsetof(struct astruct, member);239wint_t wi10;240