// RUN: rm -fR %t // RUN: %clang_cc1 -fsyntax-only -verify=c99 -std=c99 %s // RUN: %clang_cc1 -fsyntax-only -verify=c23 -std=c23 %s // RUN: %clang_cc1 -fsyntax-only -verify=c99-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -std=c99 %s // RUN: %clang_cc1 -fsyntax-only -verify=c23-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -std=c23 %s // Use C99 to verify that __need_ can be used to get types that wouldn't normally be available. struct astruct { char member; }; ptrdiff_t p0; // c99-error{{unknown type name 'ptrdiff_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} size_t s0; // c99-error{{unknown type name 'size_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} rsize_t r0; // c99-error{{unknown type name 'rsize_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} wchar_t wc0; // c99-error{{unknown type name 'wchar_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} void *v0 = NULL; // c99-error{{use of undeclared identifier 'NULL'}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}} nullptr_t n0; // c99-error{{unknown type name 'nullptr_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} static void f0(void) { unreachable(); } // c99-error{{call to undeclared function 'unreachable'}} c23-error{{undeclared identifier 'unreachable'}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m0; // c99-error{{unknown type name 'max_align_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} size_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'}} \ c23-error{{unknown type name 'size_t'}} c23-error{{undeclared identifier 'offsetof'}} c23-error{{expected expression}} c23-error{{use of undeclared identifier 'member'}} \ c99-modules-error{{unknown type}} c99-modules-error{{undeclared function}} c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{unknown type}} c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi0; // c99-error{{unknown type name 'wint_t'}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_ptrdiff_t #include ptrdiff_t p1; size_t s1; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{'size_t' must be declared before it is used}} c23-modules-error{{must be declared}} \ c99-modules-note@__stddef_size_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_size_t.h:*{{declaration here is not visible}} rsize_t r1; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{'rsize_t' must be declared before it is used}} c23-modules-error{{must be declared}} \ c99-modules-note@__stddef_rsize_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_rsize_t.h:*{{declaration here is not visible}} wchar_t wc1; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{'wchar_t' must be declared before it is used}} c23-modules-error{{must be declared}} \ c99-modules-note@__stddef_wchar_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_wchar_t.h:*{{declaration here is not visible}} void *v1 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}} nullptr_t n1; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{'nullptr_t' must be declared before it is used}} \ c23-modules-note@__stddef_nullptr_t.h:*{{declaration here is not visible}} static void f1(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m1; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{'max_align_t' must be declared before it is used}} c23-modules-error{{must be declared}} \ 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}} size_t o1 = offsetof(struct astruct, member); // c99-error{{unknown type}} c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{unknown type}} c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi1; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} // The "must be declared before used" errors are only emitted the first time a // known-but-not-visible type is seen. At this point the _Builtin_stddef module // has been built and all of the types tried, so most of the errors won't be // repeated below in modules. The types still aren't available, just the errors // aren't repeated. e.g. rsize_t still isn't available, if r1 above got deleted, // its error would move to r2 below. #define __need_size_t #include ptrdiff_t p2; size_t s2; rsize_t r2; // c99-error{{unknown type}} c23-error{{unknown type}} // c99-note@__stddef_size_t.h:*{{'size_t' declared here}} c23-note@__stddef_size_t.h:*{{'size_t' declared here}} wchar_t wc2; // c99-error{{unknown type}} c23-error{{unknown type}} void *v2 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}} nullptr_t n2; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} static void f2(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m2; // c99-error{{unknown type}} c23-error{{unknown type}} size_t o2 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi2; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_rsize_t #include ptrdiff_t p3; size_t s3; rsize_t r3; wchar_t wc3; // c99-error{{unknown type}} c23-error{{unknown type}} void *v3 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}} nullptr_t n3; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} static void f3(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m3; // c99-error{{unknown type}} c23-error{{unknown type}} size_t o3 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi3; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_wchar_t #include ptrdiff_t p4; size_t s4; rsize_t r4; wchar_t wc4; void *v4 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}} nullptr_t n4; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} static void f4(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m4; // c99-error{{unknown type}} c23-error{{unknown type}} size_t o4 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi4; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_NULL #include ptrdiff_t p5; size_t s5; rsize_t r5; wchar_t wc5; void *v5 = NULL; nullptr_t n5; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} static void f5(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m5; // c99-error{{unknown type}} c23-error{{unknown type}} size_t o5 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi5; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} // nullptr_t doesn't get declared before C23 because its definition // depends on nullptr. #define __need_nullptr_t #include ptrdiff_t p6; size_t s6; rsize_t r6; wchar_t wc6; void *v6 = NULL; nullptr_t n6; // c99-error{{unknown type}} c99-modules-error{{unknown type}} static void f6(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \ c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}} max_align_t m6; // c99-error{{unknown type}} c23-error{{unknown type}} size_t o6 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi6; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_unreachable #include ptrdiff_t p7; size_t s7; rsize_t r7; wchar_t wc7; void *v7 = NULL; nullptr_t n7 ; // c99-error{{unknown type}} c99-modules-error{{unknown type}} static void f7(void) { unreachable(); } max_align_t m7; // c99-error{{unknown type}} c23-error{{unknown type}} size_t o7 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi7; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_max_align_t #include ptrdiff_t p8; size_t s8; rsize_t r8; wchar_t wc8; void *v8 = NULL; nullptr_t n8; // c99-error{{unknown type}} c99-modules-error{{unknown type}} static void f8(void) { unreachable(); } max_align_t m8; size_t o8 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \ c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \ c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \ c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}} wint_t wi8; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_offsetof #include ptrdiff_t p9; size_t s9; rsize_t r9; nullptr_t n9; // c99-error{{unknown type}} c99-modules-error{{unknown type}} static void f9(void) { unreachable(); } wchar_t wc9; void *v9 = NULL; max_align_t m9; size_t o9 = offsetof(struct astruct, member); wint_t wi9; // c99-error{{unknown type}} c23-error{{unknown type}} \ c99-modules-error{{unknown type}} c23-modules-error{{unknown type}} #define __need_wint_t #include ptrdiff_t p10; size_t s10; rsize_t r10; wchar_t wc10; void *v10 = NULL; nullptr_t n10; // c99-error{{unknown type}} c99-modules-error{{unknown type}} static void f10(void) { unreachable(); } max_align_t m10; size_t o10 = offsetof(struct astruct, member); wint_t wi10;