diff --git a/lib/cmock_config.rb b/lib/cmock_config.rb index 716a0c5..c7db945 100644 --- a/lib/cmock_config.rb +++ b/lib/cmock_config.rb @@ -15,7 +15,7 @@ class CMockConfig :weak => '', :subdir => nil, :plugins => [], - :strippables => ['(?:__attribute__\s*\(+.*?\)+)'], + :strippables => ['(?:__attribute__\s*\([ (]*.*?[ )]*\)+)'], :attributes => %w[__ramfunc __irq __fiq register extern], :c_calling_conventions => %w[__stdcall __cdecl __fastcall], :enforce_strict_ordering => false, @@ -50,7 +50,7 @@ class CMockConfig # - The keywords can appear before or after the return type (this is a compiler warning but people do weird stuff), # so we check for word boundaries when searching for them # - We first remove "static inline" combinations and boil down to single inline or static statements - :inline_function_patterns => ['(static\s+inline|inline\s+static)\s*', '(\bstatic\b|\binline\b)\s*'] # Last part (\s*) is just to remove whitespaces (only to prettify the output) + :inline_function_patterns => ['(static\s+inline|inline\s+static)\s*', '(\bstatic\b|\binline\b)\s*', '(?:static\s*)?(?:__inline__)?__attribute__\s*\([ (]*always_inline[ )]*\)', 'static __inline__'] # Last part (\s*) is just to remove whitespaces (only to prettify the output) }.freeze def initialize(options = nil) diff --git a/test/unit/cmock_header_parser_test.rb b/test/unit/cmock_header_parser_test.rb index eedc0cb..3437de3 100644 --- a/test/unit/cmock_header_parser_test.rb +++ b/test/unit/cmock_header_parser_test.rb @@ -121,7 +121,7 @@ describe CMockHeaderParser, "Verify CMockHeaderParser Module" do " my_realloc(void*, size_t) __attribute__((alloc_size(2)));\n" + "extern int\n" + " my_printf (void *my_object, const char *my_format, ...)\n" + - " __attribute__ ((format (printf, 2, 3)));\n" + + " __attribute__ ( (format (printf, 2, 3)) );\n" + " void __attribute__ ((interrupt)) universal_handler ();\n" expected = @@ -2755,6 +2755,28 @@ describe CMockHeaderParser, "Verify CMockHeaderParser Module" do assert_equal(expected, @parser.transform_inline_functions(source)) end + it "Transform inline functions using gnu attribute notation" do + source = + "static __inline__ __attribute__ ((always_inline)) uint16_t _somefunc (uint32_t a)\n" + + "{\n" + + " return _someotherfunc (a);\n" + + "}\n" + + "static __attribute__ (( always_inline )) uint16_t _somefunc_0 (uint32_t a)\n" + + "{\n" + + " return (uint16_t) a;\n" + + "}\n" + + "\n" + + expected = + "uint16_t _somefunc (uint32_t a);\n" + + "uint16_t _somefunc_0 (uint32_t a);\n" + + "\n" + + @parser.treat_inlines = :include + @parser.inline_function_patterns = ['(?:static\s*)?(?:__inline__)?__attribute__\s*\([ (]*always_inline[ )]*\)', 'static __inline__'] + assert_equal(expected, @parser.transform_inline_functions(source)) + end + it "Transform inline functions takes user provided patterns into account" do source = "static __inline__ __attribute__ ((always_inline)) uint16_t _somefunc (uint32_t a)\n" +