diff options
Diffstat (limited to 'clang/test/Sema')
-rw-r--r-- | clang/test/Sema/Inputs/pragma-pack1.h | 23 | ||||
-rw-r--r-- | clang/test/Sema/Inputs/pragma-pack2.h | 6 | ||||
-rw-r--r-- | clang/test/Sema/pragma-pack.c | 5 | ||||
-rw-r--r-- | clang/test/Sema/suspicious-pragma-pack.c | 44 |
4 files changed, 78 insertions, 0 deletions
diff --git a/clang/test/Sema/Inputs/pragma-pack1.h b/clang/test/Sema/Inputs/pragma-pack1.h new file mode 100644 index 00000000000..40e7ad18b2c --- /dev/null +++ b/clang/test/Sema/Inputs/pragma-pack1.h @@ -0,0 +1,23 @@ + +#ifdef SET_FIRST_HEADER +#pragma pack (16) +#ifndef SET_SECOND_HEADER +// expected-note@-2 2 {{previous '#pragma pack' directive that modifies alignment is here}} +#else +// expected-note@-4 1 {{previous '#pragma pack' directive that modifies alignment is here}} +#endif +// expected-warning@+3 {{non-default #pragma pack value might change the alignment of struct or union members in the included file}} +#endif + +#include "pragma-pack2.h" + +#ifdef SET_SECOND_HEADER +// expected-warning@-3 {{the current #pragma pack aligment value is modified in the included file}} +#endif + +#ifdef PUSH_POP_FIRST_HEADER +// This is fine, we don't change the current value. +#pragma pack (push, 4) + +#pragma pack (pop) +#endif diff --git a/clang/test/Sema/Inputs/pragma-pack2.h b/clang/test/Sema/Inputs/pragma-pack2.h new file mode 100644 index 00000000000..11036133a15 --- /dev/null +++ b/clang/test/Sema/Inputs/pragma-pack2.h @@ -0,0 +1,6 @@ + +#ifdef SET_SECOND_HEADER +#pragma pack (8) // expected-note 2 {{previous '#pragma pack' directive that modifies alignment is here}} +#endif + +struct S { int x; }; diff --git a/clang/test/Sema/pragma-pack.c b/clang/test/Sema/pragma-pack.c index e93ce42148c..84a946368ff 100644 --- a/clang/test/Sema/pragma-pack.c +++ b/clang/test/Sema/pragma-pack.c @@ -25,3 +25,8 @@ #pragma pack(pop, 16) /* expected-warning {{value of #pragma pack(show) == 16}} */ #pragma pack(show) + +// Warn about unbalanced pushes. +#pragma pack (push,4) // expected-warning {{unterminated '#pragma pack (push, ...)' at end of file}} +#pragma pack (push) // expected-warning {{unterminated '#pragma pack (push, ...)' at end of file}} +#pragma pack () diff --git a/clang/test/Sema/suspicious-pragma-pack.c b/clang/test/Sema/suspicious-pragma-pack.c new file mode 100644 index 00000000000..10c41671028 --- /dev/null +++ b/clang/test/Sema/suspicious-pragma-pack.c @@ -0,0 +1,44 @@ +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DSAFE -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DSAFE -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DRESET_HERE -DSAFE -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DSET_FIRST_HEADER -DWARN_MODIFIED_HEADER -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DRESET_HERE -DSET_FIRST_HEADER -DWARN_MODIFIED_HEADER -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -DSET_FIRST_HEADER -DWARN_MODIFIED_HEADER -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -DSET_SECOND_HEADER -DWARN_MODIFIED_HEADER -verify %s +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_HERE -DPUSH_SET_HERE -DSET_FIRST_HEADER -DSET_SECOND_HEADER -DWARN_MODIFIED_HEADER -verify %s + +// RUN: %clang_cc1 -triple i686-apple-darwin9 -fsyntax-only -I %S/Inputs -DPUSH_POP_FIRST_HEADER -DSAFE -verify %s + + +#ifdef SAFE +// expected-no-diagnostics +#endif + +#ifdef PUSH_HERE +#pragma pack (push) +#endif + +#ifdef PUSH_SET_HERE +#pragma pack (push, 4) // expected-note {{previous '#pragma pack' directive that modifies alignment is here}} +// expected-warning@+8 {{non-default #pragma pack value might change the alignment of struct or union members in the included file}} +#endif + +#ifdef RESET_HERE +#pragma pack (4) +#pragma pack () // no warning after reset as the value is default. +#endif + +#include "pragma-pack1.h" + +#ifdef WARN_MODIFIED_HEADER +// expected-warning@-3 {{the current #pragma pack aligment value is modified in the included file}} +#endif + +#ifdef PUSH_SET_HERE +#pragma pack (pop) +#endif + +#ifdef PUSH_HERE +#pragma pack (pop) +#endif |