239 lines
16 KiB
C
239 lines
16 KiB
C
// 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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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 <stddef.h>
|
|
|
|
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;
|