xref: /llvm-project/clang/test/Parser/pragma-attribute-context.cpp (revision 037861b2309268245a801b9fc167097d83c8d905)
183e539b7SErik Pilkington // RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -verify -std=c++11 %s
283e539b7SErik Pilkington // RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -xobjective-c++ -verify -std=c++11 %s
3fcc53eedSErik Pilkington 
48ca6ab33SErik Pilkington #if !__has_extension(pragma_clang_attribute_external_declaration)
58ca6ab33SErik Pilkington #error
68ca6ab33SErik Pilkington #endif
78ca6ab33SErik Pilkington 
8fcc53eedSErik Pilkington #define BEGIN_PRAGMA _Pragma("clang attribute push (__attribute__((availability(macos, introduced=1000))), apply_to=function)")
9fcc53eedSErik Pilkington #define END_PRAGMA _Pragma("clang attribute pop")
10fcc53eedSErik Pilkington 
11fcc53eedSErik Pilkington extern "C" {
12fcc53eedSErik Pilkington BEGIN_PRAGMA
13fcc53eedSErik Pilkington int f(); // expected-note{{'f' has been marked as being introduced in macOS 1000 here}}
14fcc53eedSErik Pilkington END_PRAGMA
15fcc53eedSErik Pilkington }
16fcc53eedSErik Pilkington 
17fcc53eedSErik Pilkington namespace my_ns {
18fcc53eedSErik Pilkington BEGIN_PRAGMA
19fcc53eedSErik Pilkington int g(); // expected-note{{'g' has been marked as being introduced in macOS 1000 here}}
20fcc53eedSErik Pilkington END_PRAGMA
21fcc53eedSErik Pilkington namespace nested {
22fcc53eedSErik Pilkington BEGIN_PRAGMA
23fcc53eedSErik Pilkington int h(); // expected-note{{'h' has been marked as being introduced in macOS 1000 here}}
24fcc53eedSErik Pilkington END_PRAGMA
25fcc53eedSErik Pilkington }
26fcc53eedSErik Pilkington }
27fcc53eedSErik Pilkington 
28fcc53eedSErik Pilkington int a = f(); // expected-warning{{'f' is only available on macOS 1000 or newer}} expected-note{{annotate 'a'}}
29fcc53eedSErik Pilkington int b = my_ns::g(); // expected-warning{{'g' is only available on macOS 1000 or newer}} expected-note{{annotate 'b'}}
30fcc53eedSErik Pilkington int c = my_ns::nested::h(); // expected-warning{{'h' is only available on macOS 1000 or newer}} expected-note{{annotate 'c'}}
31fcc53eedSErik Pilkington 
32fcc53eedSErik Pilkington struct InStruct {
33fcc53eedSErik Pilkington   // FIXME: This asserts in Objective-C++!
34fcc53eedSErik Pilkington #ifndef __OBJC__
35*037861b2SSerge Pavlov   BEGIN_PRAGMA // expected-error {{this pragma cannot appear in struct declaration}}
36fcc53eedSErik Pilkington #endif
37fcc53eedSErik Pilkington };
38