// RUN: %clang_cc1 -fsyntax-only -verify %s
#defineINT_TAG42staticconstinttest_in
__attribute__((type_tag_for_datatype(test,int)))=INT_TAG;// Argument index: 1, Type tag index: 2
voidtest_bounds_index(...)__attribute__((argument_with_type_tag(test,1,2)));// Argument index: 1, Type tag index: 2
voidtest_bounds_index_ptr(void*,...)__attribute__((pointer_with_type_tag(test,1,2)));// Argument index: 3, Type tag index: 1
voidtest_bounds_arg_index(...)__attribute__((argument_with_type_tag(test,3,1)));classC{public:// Argument index: 2, Type tag index: 3
voidtest_bounds_index(...)__attribute__((argument_with_type_tag(test,2,3)));// Argument index: 2, Type tag index: 3
voidtest_bounds_index_ptr(void*,...)__attribute__((pointer_with_type_tag(test,2,3)));// Argument index: 4, Type tag index: 2
voidtest_bounds_arg_index(...)__attribute__((argument_with_type_tag(test,4,2)));};voidtest_bounds(){
C c;// Test the boundary edges (ensure no off-by-one) with argument indexing.
test_bounds_index(1, INT_TAG);
c.test_bounds_index(1, INT_TAG);test_bounds_index_ptr(0, INT_TAG);
c.test_bounds_index_ptr(0, INT_TAG);test_bounds_index(1);// expected-error {{type tag index 2 is greater than the number of arguments specified}}
c.test_bounds_index(1);// expected-error {{type tag index 3 is greater than the number of arguments specified}}
test_bounds_index_ptr(0);// expected-error {{type tag index 2 is greater than the number of arguments specified}}
c.test_bounds_index_ptr(0);// expected-error {{type tag index 3 is greater than the number of arguments specified}}
test_bounds_arg_index(INT_TAG,1);// expected-error {{argument index 3 is greater than the number of arguments specified}}
c.test_bounds_arg_index(INT_TAG,1);// expected-error {{argument index 4 is greater than the number of arguments specified}}
}