Execute(The GCC handler should ignore other lines of output): AssertEqual \ [], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ 'foo', \ 'bar', \ 'baz', \ ]) Execute(GCC errors from included files should be parsed correctly): AssertEqual \ [ \ { \ 'lnum': 1, \ 'col': 1, \ 'filename': 'broken.h', \ 'type': 'E', \ 'text': 'expected identifier or ''('' before ''{'' token', \ }, \ { \ 'lnum': 3, \ 'col': 2, \ 'text': 'Error found in header. See :ALEDetail', \ 'detail': join([ \ 'In file included from :3:2:', \ 'broken.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ ], "\n"), \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ 'In file included from :3:2:', \ 'broken.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ 'compilation terminated.', \ ]) AssertEqual \ [ \ { \ 'lnum': 1, \ 'col': 1, \ 'filename': 'b.h', \ 'type': 'E', \ 'text': 'expected identifier or ''('' before ''{'' token', \ }, \ { \ 'lnum': 5, \ 'text': 'Error found in header. See :ALEDetail', \ 'detail': join([ \ 'In file included from a.h:1:0,', \ ' from :5:', \ 'b.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ ], "\n"), \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ 'In file included from a.h:1:0,', \ ' from :5:', \ 'b.h:1:1: error: expected identifier or ''('' before ''{'' token', \ ' {{{', \ ' ^', \ 'compilation terminated.', \ ]) AssertEqual \ [ \ { \ 'lnum': 1, \ 'col': 1, \ 'filename': 'b.h', \ 'type': 'E', \ 'text': 'unknown type name ''bad_type''', \ }, \ { \ 'lnum': 2, \ 'col': 1, \ 'filename': 'b.h', \ 'type': 'E', \ 'text': 'unknown type name ''other_bad_type''', \ }, \ { \ 'lnum': 3, \ 'text': 'Error found in header. See :ALEDetail', \ 'detail': join([ \ 'In file included from a.h:1:0,', \ ' from :3:', \ 'b.h:1:1: error: unknown type name ‘bad_type’', \ ' bad_type x;', \ ' ^', \ 'b.h:2:1: error: unknown type name ‘other_bad_type’', \ ' other_bad_type y;', \ ' ^', \ ], "\n"), \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ 'In file included from a.h:1:0,', \ ' from :3:', \ 'b.h:1:1: error: unknown type name ‘bad_type’', \ ' bad_type x;', \ ' ^', \ 'b.h:2:1: error: unknown type name ‘other_bad_type’', \ ' other_bad_type y;', \ ' ^', \ 'compilation terminated.', \ ]) Execute(The GCC handler shouldn't complain about #pragma once for headers): silent file! test.h AssertEqual \ [], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ':1:1: warning: #pragma once in main file [enabled by default]', \ ]) silent file! test.hpp AssertEqual \ [], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ':1:1: warning: #pragma once in main file [enabled by default]', \ ]) Execute(The GCC handler should handle syntax errors): AssertEqual \ [ \ { \ 'lnum': 6, \ 'col': 12, \ 'type': 'E', \ 'text': 'invalid suffix "p" on integer constant' \ }, \ { \ 'lnum': 17, \ 'col': 5, \ 'type': 'E', \ 'text': 'invalid suffix "n" on integer constant' \ }, \ { \ 'lnum': 4, \ 'type': 'E', \ 'text': 'variable or field ''foo'' declared void' \ }, \ { \ 'lnum': 4, \ 'type': 'E', \ 'text': '''cat'' was not declared in this scope' \ }, \ { \ 'lnum': 12, \ 'type': 'E', \ 'text': 'expected '';'' before ''o''' \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ':6:12: error: invalid suffix "p" on integer constant', \ ':17:5: error: invalid suffix "n" on integer constant', \ ':4: error: variable or field ''foo'' declared void', \ ':4: error: ''cat'' was not declared in this scope', \ ':12: error: expected `;'' before ''o''', \ ]) Execute(The GCC handler should handle notes with no previous message): AssertEqual \ [], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ':1:1: note: x', \ ':1:1: note: x', \ ]) Execute(The GCC handler should attach notes to previous messages): AssertEqual \ [ \ { \ 'lnum': 6, \ 'col': 12, \ 'type': 'E', \ 'text': 'Some error', \ 'detail': "Some error\n:1:1: note: x", \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ '-:6:12: error: Some error', \ ':1:1: note: x', \ ]) Execute(The GCC handler should interpret - as being the current file): AssertEqual \ [ \ { \ 'lnum': 6, \ 'col': 12, \ 'type': 'E', \ 'text': 'Some error', \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ '-:6:12: error: Some error', \ ]) Execute(The GCC handler should handle fatal error messages due to missing files): AssertEqual \ [ \ { \ 'lnum': 3, \ 'col': 12, \ 'type': 'E', \ 'text': 'foo.h: No such file or directory' \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ':3:12: fatal error: foo.h: No such file or directory', \ ]) Execute(The GCC handler should handle errors for inlined header functions): AssertEqual \ [ \ { \ 'lnum': 50, \ 'col': 4, \ 'filename': '/usr/include/bits/fcntl2.h', \ 'type': 'E', \ 'text': 'call to ''__open_missing_mode'' declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments', \ }, \ { \ 'lnum': 44, \ 'col': 5, \ 'filename': '/usr/include/bits/fcntl2.h', \ 'type': 'E', \ 'text': 'call to ''__open_too_many_args'' declared with attribute error: open can be called either with 2 or 3 arguments, not more', \ }, \ { \ 'lnum': 7, \ 'col': 10, \ 'type': 'E', \ 'text': 'call to ''__open_missing_mode'' declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments', \ }, \ { \ 'lnum': 13, \ 'col': 11, \ 'type': 'E', \ 'text': 'call to ''__open_too_many_args'' declared with attribute error: open can be called either with 2 or 3 arguments, not more', \ }, \ { \ 'lnum': 1, \ 'text': 'Error found in header. See :ALEDetail', \ 'detail': join([ \ 'In file included from /usr/include/fcntl.h:328,', \ ' from :1:', \ 'In function ‘open’,', \ ' inlined from ‘main’ at :7:10:', \ '/usr/include/bits/fcntl2.h:50:4: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments', \ ' __open_missing_mode ();', \ ' ^~~~~~~~~~~~~~~~~~~~~~', \ 'In function ‘open’,', \ ' inlined from ‘main’ at :13:11:', \ '/usr/include/bits/fcntl2.h:44:5: error: call to ‘__open_too_many_args’ declared with attribute error: open can be called either with 2 or 3 arguments, not more', \ ' __open_too_many_args ();', \ ], "\n") \ }, \], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ 'In file included from /usr/include/fcntl.h:328,', \ ' from :1:', \ 'In function ‘open’,', \ ' inlined from ‘main’ at :7:10:', \ '/usr/include/bits/fcntl2.h:50:4: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments', \ ' __open_missing_mode ();', \ ' ^~~~~~~~~~~~~~~~~~~~~~', \ 'In function ‘open’,', \ ' inlined from ‘main’ at :13:11:', \ '/usr/include/bits/fcntl2.h:44:5: error: call to ‘__open_too_many_args’ declared with attribute error: open can be called either with 2 or 3 arguments, not more', \ ' __open_too_many_args ();', \ ' ^~~~~~~~~~~~~~~~~~~~~~~', \ ]) Execute(The GCC handler should handle macro expansion errors in current file): AssertEqual \ [ \ { \ 'lnum': 1, \ 'col': 19, \ 'type': 'E', \ 'text': 'error message', \ 'detail': "error message\n:1:19: note: in expansion of macro 'TEST'", \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ': error: error message', \ ':1:19: note: in expansion of macro ‘TEST’', \ ' 1 | std::string str = TEST;', \ ' | ^~~~', \ ]) Execute(The GCC handler should handle macro expansion errors in other files): AssertEqual \ [ \ { \ 'lnum': 0, \ 'type': 'E', \ 'text': 'Error found in macro expansion. See :ALEDetail', \ 'detail': "error message\ninc.h:1:19: note: in expansion of macro 'TEST'", \ }, \ ], \ ale#handlers#gcc#HandleGCCFormatWithIncludes(347, [ \ ': error: error message', \ 'inc.h:1:19: note: in expansion of macro ‘TEST’', \ ' 1 | std::string str = TEST;', \ ' | ^~~~', \ ])