llvm-project/clang/test/Sema/attr-visibility.c
Nikolas Klauser afc6c2bb9b
[Clang] Allow the use of [[gnu::visibility]] with #pragma clang attribute (#145653)
I don't see any reason this shouldn't be allowed. AFAICT this is only
disabled due to the heuristics used to determine whether it makes sense
to allow the use of an attribute with `#pragma clang attribute`.

This allows libc++ to drop `_LIBCPP_HIDE_FROM_ABI` in a lot of places,
making the library significantly easier to read.
2025-06-26 14:54:15 +02:00

34 lines
1.8 KiB
C

// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify %s
void test0(void) __attribute__((visibility("default")));
void test1(void) __attribute__((visibility("hidden")));
void test2(void) __attribute__((visibility("internal")));
void test3(void) __attribute__((visibility("protected"))); // expected-warning {{target does not support 'protected' visibility; using 'default'}}
struct __attribute__((visibility("hidden"))) test4; // expected-note {{previous attribute is here}}
struct test4;
struct __attribute__((visibility("default"))) test4; // expected-error {{visibility does not match previous declaration}}
struct test5;
struct __attribute__((visibility("hidden"))) test5; // expected-note {{previous attribute is here}}
struct __attribute__((visibility("default"))) test5; // expected-error {{visibility does not match previous declaration}}
void test6(void) __attribute__((visibility("default"), // expected-error {{visibility does not match previous declaration}}
visibility("hidden"))); // expected-note {{previous attribute is here}}
extern int test7 __attribute__((visibility("default"))); // expected-note {{previous attribute is here}}
extern int test7 __attribute__((visibility("hidden"))); // expected-error {{visibility does not match previous declaration}}
typedef int __attribute__((visibility("default"))) bar; // expected-warning {{'visibility' attribute ignored}}
int x __attribute__((type_visibility("default"))); // expected-error {{'type_visibility' attribute only applies to types and namespaces}}
int PR17105 __attribute__((visibility(hidden))); // expected-error {{'visibility' attribute requires a string}}
#pragma clang attribute push([[gnu::visibility("default")]], apply_to=function)
void func(void) {}
#pragma clang attribute pop