CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
45 lines
1.9 KiB
C
45 lines
1.9 KiB
C
// RUN: %clang_cc1 -verify -std=c99 %s
|
|
// RUN: %clang_cc1 -verify -std=c23 %s
|
|
|
|
/* WG14 N448: Partial
|
|
* Restricted pointers
|
|
*
|
|
* NB: we claim partial conformance only because LLVM does not attempt to apply
|
|
* the semantics on local variables or structure data members; it only
|
|
* considers function parameters. However, Clang itself is fully conforming for
|
|
* this feature.
|
|
*/
|
|
|
|
// Restrict is only allowed on pointers.
|
|
int * restrict ipr;
|
|
int restrict ir; // expected-error {{restrict requires a pointer or reference ('int' is invalid)}}
|
|
|
|
// Restrict only applies to object pointers.
|
|
void (* restrict fp)(void); // expected-error {{pointer to function type 'void (void)' may not be 'restrict' qualified}}
|
|
|
|
typedef int *int_ptr;
|
|
int_ptr restrict ipr2; // okay, still applied to the pointer.
|
|
|
|
// Show that the qualifer is dropped on lvalue conversion
|
|
_Static_assert(
|
|
_Generic(ipr,
|
|
int * : 1,
|
|
int * restrict : 0, // expected-warning {{due to lvalue conversion of the controlling expression, association of type 'int *restrict' will never be selected because it is qualified}}
|
|
default : 0),
|
|
"");
|
|
|
|
// Show that it's allowed as a qualifier for array parameters.
|
|
void f(int array[restrict]) {
|
|
int *ipnr = ipr; // okay to drop the top-level qualifier
|
|
|
|
// Show that it's not okay to drop the qualifier when it's not at the top level.
|
|
int * restrict * restrict iprpr;
|
|
int **ipp = iprpr; // expected-warning {{initializing 'int **' with an expression of type 'int *restrict *restrict' discards qualifiers}}
|
|
int ** restrict ippr = iprpr; // expected-warning {{initializing 'int **restrict' with an expression of type 'int *restrict *restrict' discards qualifiers}}
|
|
}
|
|
|
|
#if __STDC_VERSION__ >= 202311L
|
|
// C23 doesn't allow constexpr to mix with restrict. See C23 6.7.2p5.
|
|
constexpr int * restrict ip; // expected-error {{constexpr variable cannot have type 'int *const restrict'}}
|
|
#endif // __STDC_VERSION__ >= 202311L
|