summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2017-04-29 20:00:29 +0100
committerw0rp <devw0rp@gmail.com>2017-04-29 20:00:42 +0100
commit2c7d14809d5e143af89317461daadd12408bfbd5 (patch)
tree5731835343d05eb8ddd539c4f41aae1ac21a5f0b
parentdfb10f1db2d2aaacf6c1bcc6fe69223398a46420 (diff)
downloadale-2c7d14809d5e143af89317461daadd12408bfbd5.zip
Set GCC flags appropriately for older versions
-rw-r--r--ale_linters/cpp/gcc.vim21
-rw-r--r--autoload/ale/handlers/gcc.vim12
-rw-r--r--test/handler/test_gcc_handler.vader11
3 files changed, 34 insertions, 10 deletions
diff --git a/ale_linters/cpp/gcc.vim b/ale_linters/cpp/gcc.vim
index 9e8f859d..19de0c9c 100644
--- a/ale_linters/cpp/gcc.vim
+++ b/ale_linters/cpp/gcc.vim
@@ -3,16 +3,17 @@
" Set this option to change the GCC options for warnings for C.
if !exists('g:ale_cpp_gcc_options')
- " added c++14 standard support
- " POSIX thread and standard c++ thread and atomic library Linker
- " let g:ale_cpp_gcc_options = '-std=c++1z' for c++17
- " for previous version and default, you can just use
- " let g:ale_cpp_gcc_options = '-Wall'
- " for more see man pages of gcc
- " $ man g++
- " make sure g++ in your $PATH
- " Add flags according to your requirements
- let g:ale_cpp_gcc_options = '-std=c++14 -Wall'
+ let s:version = ale#handlers#gcc#ParseGCCVersion(systemlist('gcc --version'))
+
+ if !empty(s:version) && ale#semver#GreaterOrEqual(s:version, [4, 9, 0])
+ " Use c++14 support in 4.9 and above.
+ let g:ale_cpp_gcc_options = '-std=c++14 -Wall'
+ else
+ " Use c++1y in older versions.
+ let g:ale_cpp_gcc_options = '-std=c++1y -Wall'
+ endif
+
+ unlet! s:version
endif
function! ale_linters#cpp#gcc#GetCommand(buffer) abort
diff --git a/autoload/ale/handlers/gcc.vim b/autoload/ale/handlers/gcc.vim
index fe941734..75964f72 100644
--- a/autoload/ale/handlers/gcc.vim
+++ b/autoload/ale/handlers/gcc.vim
@@ -26,6 +26,18 @@ function! s:RemoveUnicodeQuotes(text) abort
return l:text
endfunction
+function! ale#handlers#gcc#ParseGCCVersion(lines) abort
+ for l:line in a:lines
+ let l:match = matchstr(l:line, '\d\.\d\.\d')
+
+ if !empty(l:match)
+ return ale#semver#Parse(l:match)
+ endif
+ endfor
+
+ return []
+endfunction
+
function! ale#handlers#gcc#HandleGCCFormat(buffer, lines) abort
let l:include_pattern = '\v^(In file included | *)from ([^:]*):(\d+)'
let l:include_lnum = 0
diff --git a/test/handler/test_gcc_handler.vader b/test/handler/test_gcc_handler.vader
index 3d5a24d4..990df2c5 100644
--- a/test/handler/test_gcc_handler.vader
+++ b/test/handler/test_gcc_handler.vader
@@ -66,3 +66,14 @@ Execute(GCC errors from included files should be parsed correctly):
\ ' other_bad_type y;',
\ ' ^',
\ ])
+
+Execute(GCC versions should be parsed correctly):
+ AssertEqual [4, 9, 1], ale#handlers#gcc#ParseGCCVersion([
+ \ 'g++ (GCC) 4.9.1 20140922 (Red Hat 4.9.1-10)',
+ \])
+ AssertEqual [4, 8, 4], ale#handlers#gcc#ParseGCCVersion([
+ \ 'gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4',
+ \ 'Copyright (C) 2013 Free Software Foundation, Inc.',
+ \ 'This is free software; see the source for copying conditions. There is NO',
+ \ 'warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.',
+ \])