diff options
| author | Aaron Ballman <aaron@aaronballman.com> | 2013-05-22 23:25:32 +0000 |
|---|---|---|
| committer | Aaron Ballman <aaron@aaronballman.com> | 2013-05-22 23:25:32 +0000 |
| commit | 317a77f1c7ab25443cc1cf50d457b9a394ec2fc1 (patch) | |
| tree | 3e7daebf80d6d22bdcd6f29f4a158070c83ae961 /clang/test | |
| parent | 81f43ae23ac5f9b901fd99106f265d13164af39e (diff) | |
| download | bcm5719-llvm-317a77f1c7ab25443cc1cf50d457b9a394ec2fc1.tar.gz bcm5719-llvm-317a77f1c7ab25443cc1cf50d457b9a394ec2fc1.zip | |
Adding in parsing and the start of semantic support for __sptr and __uptr pointer type qualifiers. This patch also fixes the correlated __ptr32 and __ptr64 pointer qualifiers so that they are truly type attributes instead of declaration attributes.
For more information about __sptr and __uptr, see MSDN: http://msdn.microsoft.com/en-us/library/aa983399.aspx
Patch reviewed by Richard Smith.
llvm-svn: 182535
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Parser/MicrosoftExtensions.c | 11 | ||||
| -rw-r--r-- | clang/test/Sema/MicrosoftCompatibility.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Sema/MicrosoftExtensions.c | 29 | ||||
| -rw-r--r-- | clang/test/Sema/attr-print.c | 19 |
4 files changed, 62 insertions, 3 deletions
diff --git a/clang/test/Parser/MicrosoftExtensions.c b/clang/test/Parser/MicrosoftExtensions.c index 35c63d4b552..de933f9e5d6 100644 --- a/clang/test/Parser/MicrosoftExtensions.c +++ b/clang/test/Parser/MicrosoftExtensions.c @@ -105,3 +105,14 @@ __declspec() void quux( void ) { struct S7 s; int i = s.t; /* expected-warning {{'t' is deprecated}} */ } + +int * __sptr psp; +int * __uptr pup; +/* Either ordering is acceptable */ +int * __ptr32 __sptr psp32; +int * __ptr32 __uptr pup32; +int * __sptr __ptr64 psp64; +int * __uptr __ptr64 pup64; + +/* Legal to have nested pointer attributes */ +int * __sptr * __ptr32 ppsp32; diff --git a/clang/test/Sema/MicrosoftCompatibility.cpp b/clang/test/Sema/MicrosoftCompatibility.cpp index 15c25586c47..90a45dfaaf1 100644 --- a/clang/test/Sema/MicrosoftCompatibility.cpp +++ b/clang/test/Sema/MicrosoftCompatibility.cpp @@ -2,3 +2,9 @@ // PR15845 int foo(xxx); // expected-error{{unknown type name}} + +struct cls { + char *m; +}; + +char * cls::* __uptr wrong2 = &cls::m; // expected-error {{'__uptr' attribute cannot be used with pointers to members}} diff --git a/clang/test/Sema/MicrosoftExtensions.c b/clang/test/Sema/MicrosoftExtensions.c index 5d7330e3f70..a66d9a9eb0f 100644 --- a/clang/test/Sema/MicrosoftExtensions.c +++ b/clang/test/Sema/MicrosoftExtensions.c @@ -102,3 +102,32 @@ void test( void ) { enum DE1 no; // no warning because E1 is not deprecated } + +int __sptr wrong1; // expected-error {{'__sptr' attribute only applies to pointer arguments}} +// The modifier must follow the asterisk +int __sptr *wrong_psp; // expected-error {{'__sptr' attribute only applies to pointer arguments}} +int * __sptr __uptr wrong2; // expected-error {{'__sptr' and '__uptr' attributes are not compatible}} +int * __sptr __sptr wrong3; // expected-warning {{attribute '__sptr' is already applied}} + +// It is illegal to overload based on the type attribute. +void ptr_func(int * __ptr32 i) {} // expected-note {{previous definition is here}} +void ptr_func(int * __ptr64 i) {} // expected-error {{redefinition of 'ptr_func'}} + +// It is also illegal to overload based on the pointer type attribute. +void ptr_func2(int * __sptr __ptr32 i) {} // expected-note {{previous definition is here}} +void ptr_func2(int * __uptr __ptr32 i) {} // expected-error {{redefinition of 'ptr_func2'}} + +int * __sptr __ptr32 __sptr wrong4; // expected-warning {{attribute '__sptr' is already applied}} + +__ptr32 int *wrong5; // expected-error {{'__ptr32' attribute only applies to pointer arguments}} + +int *wrong6 __ptr32; // expected-error {{expected ';' after top level declarator}} expected-warning {{declaration does not declare anything}} + +int * __ptr32 __ptr64 wrong7; // expected-error {{'__ptr32' and '__ptr64' attributes are not compatible}} + +int * __ptr32 __ptr32 wrong8; // expected-warning {{attribute '__ptr32' is already applied}} + +int *(__ptr32 __sptr wrong9); // expected-error {{'__sptr' attribute only applies to pointer arguments}} // expected-error {{'__ptr32' attribute only applies to pointer arguments}} + +typedef int *T; +T __ptr32 wrong10; // expected-error {{'__ptr32' attribute only applies to pointer arguments}} diff --git a/clang/test/Sema/attr-print.c b/clang/test/Sema/attr-print.c index 2659508e562..b3bdfd72e64 100644 --- a/clang/test/Sema/attr-print.c +++ b/clang/test/Sema/attr-print.c @@ -13,9 +13,22 @@ void foo() __attribute__((const)); // CHECK: void bar() __attribute__((__const)); void bar() __attribute__((__const)); -// FIXME: Print these at a valid location for these attributes. -// CHECK: int *p32 __ptr32; +// CHECK: int * __ptr32 p32; int * __ptr32 p32; -// CHECK: int *p64 __ptr64; +// CHECK: int * __ptr64 p64; int * __ptr64 p64; + +// TODO: the Type Printer has no way to specify the order to print attributes +// in, and so it currently always prints them in reverse order. Fix this. +// CHECK: int * __ptr32 __uptr p32_2; +int * __uptr __ptr32 p32_2; + +// CHECK: int * __ptr64 __sptr p64_2; +int * __sptr __ptr64 p64_2; + +// CHECK: int * __ptr32 __uptr p32_3; +int * __uptr __ptr32 p32_3; + +// CHECK: int * __sptr * __ptr32 ppsp32; +int * __sptr * __ptr32 ppsp32; |

