// RUN: %clang_cc1 -fsyntax-only -verify %s #define INT_TAG 42 static const int test_in __attribute__((type_tag_for_datatype(test, int))) = INT_TAG; // Argument index: 1, Type tag index: 2 void test_bounds_index(...) __attribute__((argument_with_type_tag(test, 1, 2))); // Argument index: 1, Type tag index: 2 void test_bounds_index_ptr(void *, ...) __attribute__((pointer_with_type_tag(test, 1, 2))); // Argument index: 3, Type tag index: 1 void test_bounds_arg_index(...) __attribute__((argument_with_type_tag(test, 3, 1))); class C { public: // Argument index: 2, Type tag index: 3 void test_bounds_index(...) __attribute__((argument_with_type_tag(test, 2, 3))); // Argument index: 2, Type tag index: 3 void test_bounds_index_ptr(void *, ...) __attribute__((pointer_with_type_tag(test, 2, 3))); // Argument index: 4, Type tag index: 2 void test_bounds_arg_index(...) __attribute__((argument_with_type_tag(test, 4, 2))); }; void test_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}} }