Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support gnu standard versions for querying compiler #2782

Closed
invedj opened this issue Nov 7, 2018 · 14 comments
Closed

Support gnu standard versions for querying compiler #2782

invedj opened this issue Nov 7, 2018 · 14 comments
Labels
Feature: Configuration An issue related to configuring the extension or IntelliSense Feature Request fixed Check the Milestone for the release in which the fix is or will be available. Language Service
Milestone

Comments

@invedj
Copy link

invedj commented Nov 7, 2018

Hi, I am receiving the error identifier "CLOCK_MONOTONIC" is undefined from cpptools for the below code, which I don't receive when compiling with gcc. If I include "defines": ["_POSIX_C_SOURCE 199309L"] in c_cpp_properties.json then the issue is resolved and cpptools doesn't complain.

My question is, why is this behavior different when I compile with gcc? I believe the default C standard for gcc is gnu11, which doesn't require _POSIX_C_SOURCE to be defined. Is cpptools using a different standard, and if so is there a way to force using gnu11? I've tried adding -std=gnu11 to the compiler path, but that doesn't seem to solve the issue.

  • OS and Version: Ubuntu 16.04.3 LTS
  • VS Code Version: 1.28.2
  • C/C++ Extension Version: 0.20.1
  • Other extensions: none
#include <stdint.h>
#include <time.h>

uint64_t timer_diff(struct timespec *start)
{
	uint64_t diff;
	struct timespec now;

	clock_gettime(CLOCK_MONOTONIC, &now);

	diff = UINT64_C(1000000000) * (now.tv_sec - start->tv_sec) +
		   now.tv_nsec - start->tv_nsec;

	return diff;
}
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "compilerPath": "/usr/lib/gcc",
            "intelliSenseMode": "gcc-x64",
            "browse": {
                "path": [
                    "${workspaceFolder}/**"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            },
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}
initialized
workspace/didChangeConfiguration
IntelliSense Engine = Default.
The extension will use the Tag Parser for IntelliSense when #includes don't resolve.
Autocomplete is enabled.
Error squiggles are enabled.
File exclude: **/.git
File exclude: **/.svn
File exclude: **/.hg
File exclude: **/CVS
File exclude: **/.DS_Store
File exclude: **/.vscode
Search exclude: **/node_modules
Search exclude: **/bower_components
Search exclude: **/.vscode
textDocument/didOpen
cpptools/queryCompilerDefaults
Attempting to get defaults from compiler found on the machine: '/usr/bin/gcc'
terminating child process: 5243
cpptools/activeDocumentChange
cpptools/textEditorSelectionChange
cpptools/didChangeFolderSettings
Attempting to get defaults from compiler found on the machine: '/usr/bin/gcc'
Code browsing service initialized
Attempting to get defaults from compiler found on the machine: '/usr/bin/gcc'
  Folder: /usr/lib/gcc/x86_64-linux-gnu/5/include/ will be indexed
  Folder: /usr/local/include/ will be indexed
  Folder: /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/ will be indexed
  Folder: /usr/include/ will be indexed
  Folder: /home/dan/Desktop/vscode-test/ will be indexed
textDocument/didOpen
Discovering files...
  Processing folder (recursive): /usr/lib/gcc/x86_64-linux-gnu/5/include/
  Processing folder (recursive): /usr/local/include/
  Processing folder (recursive): /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/
  Processing folder (recursive): /usr/include/
textDocument/documentSymbol
textDocument/codeAction
sending compilation args for /home/dan/Desktop/vscode-test/main.c
  include: /usr/lib/gcc/x86_64-linux-gnu/5/include
  include: /usr/local/include
  include: /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
  include: /usr/include/x86_64-linux-gnu
  include: /usr/include
  define: __STDC__=1
  define: __STDC_VERSION__=201112L
  define: __STDC_UTF_16__=1
  define: __STDC_UTF_32__=1
  define: __STDC_HOSTED__=1
  define: __GNUC__=5
  define: __GNUC_MINOR__=4
  define: __GNUC_PATCHLEVEL__=0
  define: __VERSION__="5.4.0 20160609"
  define: __ATOMIC_RELAXED=0
  define: __ATOMIC_SEQ_CST=5
  define: __ATOMIC_ACQUIRE=2
  define: __ATOMIC_RELEASE=3
  define: __ATOMIC_ACQ_REL=4
  define: __ATOMIC_CONSUME=1
  define: __FINITE_MATH_ONLY__=0
  define: _LP64=1
  define: __LP64__=1
  define: __SIZEOF_INT__=4
  define: __SIZEOF_LONG__=8
  define: __SIZEOF_LONG_LONG__=8
  define: __SIZEOF_SHORT__=2
  define: __SIZEOF_FLOAT__=4
  define: __SIZEOF_DOUBLE__=8
  define: __SIZEOF_LONG_DOUBLE__=16
  define: __SIZEOF_SIZE_T__=8
  define: __CHAR_BIT__=8
  define: __BIGGEST_ALIGNMENT__=16
  define: __ORDER_LITTLE_ENDIAN__=1234
  define: __ORDER_BIG_ENDIAN__=4321
  define: __ORDER_PDP_ENDIAN__=3412
  define: __BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__
  define: __FLOAT_WORD_ORDER__=__ORDER_LITTLE_ENDIAN__
  define: __SIZEOF_POINTER__=8
  define: __SIZE_TYPE__=long unsigned int
  define: __PTRDIFF_TYPE__=long int
  define: __WCHAR_TYPE__=int
  define: __WINT_TYPE__=unsigned int
  define: __INTMAX_TYPE__=long int
  define: __UINTMAX_TYPE__=long unsigned int
  define: __CHAR16_TYPE__=short unsigned int
  define: __CHAR32_TYPE__=unsigned int
  define: __SIG_ATOMIC_TYPE__=int
  define: __INT8_TYPE__=signed char
  define: __INT16_TYPE__=short int
  define: __INT32_TYPE__=int
  define: __INT64_TYPE__=long int
  define: __UINT8_TYPE__=unsigned char
  define: __UINT16_TYPE__=short unsigned int
  define: __UINT32_TYPE__=unsigned int
  define: __UINT64_TYPE__=long unsigned int
  define: __INT_LEAST8_TYPE__=signed char
  define: __INT_LEAST16_TYPE__=short int
  define: __INT_LEAST32_TYPE__=int
  define: __INT_LEAST64_TYPE__=long int
  define: __UINT_LEAST8_TYPE__=unsigned char
  define: __UINT_LEAST16_TYPE__=short unsigned int
  define: __UINT_LEAST32_TYPE__=unsigned int
  define: __UINT_LEAST64_TYPE__=long unsigned int
  define: __INT_FAST8_TYPE__=signed char
  define: __INT_FAST16_TYPE__=long int
  define: __INT_FAST32_TYPE__=long int
  define: __INT_FAST64_TYPE__=long int
  define: __UINT_FAST8_TYPE__=unsigned char
  define: __UINT_FAST16_TYPE__=long unsigned int
  define: __UINT_FAST32_TYPE__=long unsigned int
  define: __UINT_FAST64_TYPE__=long unsigned int
  define: __INTPTR_TYPE__=long int
  define: __UINTPTR_TYPE__=long unsigned int
  define: __has_include(STR)=__has_include__(STR)
  define: __has_include_next(STR)=__has_include_next__(STR)
  define: __GXX_ABI_VERSION=1009
  define: __SCHAR_MAX__=0x7f
  define: __SHRT_MAX__=0x7fff
  define: __INT_MAX__=0x7fffffff
  define: __LONG_MAX__=0x7fffffffffffffffL
  define: __LONG_LONG_MAX__=0x7fffffffffffffffLL
  define: __WCHAR_MAX__=0x7fffffff
  define: __WCHAR_MIN__=(-__WCHAR_MAX__ - 1)
  define: __WINT_MAX__=0xffffffffU
  define: __WINT_MIN__=0U
  define: __PTRDIFF_MAX__=0x7fffffffffffffffL
  define: __SIZE_MAX__=0xffffffffffffffffUL
  define: __INTMAX_MAX__=0x7fffffffffffffffL
  define: __INTMAX_C(c)=c ## L
  define: __UINTMAX_MAX__=0xffffffffffffffffUL
  define: __UINTMAX_C(c)=c ## UL
  define: __SIG_ATOMIC_MAX__=0x7fffffff
  define: __SIG_ATOMIC_MIN__=(-__SIG_ATOMIC_MAX__ - 1)
  define: __INT8_MAX__=0x7f
  define: __INT16_MAX__=0x7fff
  define: __INT32_MAX__=0x7fffffff
  define: __INT64_MAX__=0x7fffffffffffffffL
  define: __UINT8_MAX__=0xff
  define: __UINT16_MAX__=0xffff
  define: __UINT32_MAX__=0xffffffffU
  define: __UINT64_MAX__=0xffffffffffffffffUL
  define: __INT_LEAST8_MAX__=0x7f
  define: __INT8_C(c)=c
  define: __INT_LEAST16_MAX__=0x7fff
  define: __INT16_C(c)=c
  define: __INT_LEAST32_MAX__=0x7fffffff
  define: __INT32_C(c)=c
  define: __INT_LEAST64_MAX__=0x7fffffffffffffffL
  define: __INT64_C(c)=c ## L
  define: __UINT_LEAST8_MAX__=0xff
  define: __UINT8_C(c)=c
  define: __UINT_LEAST16_MAX__=0xffff
  define: __UINT16_C(c)=c
  define: __UINT_LEAST32_MAX__=0xffffffffU
  define: __UINT32_C(c)=c ## U
  define: __UINT_LEAST64_MAX__=0xffffffffffffffffUL
  define: __UINT64_C(c)=c ## UL
  define: __INT_FAST8_MAX__=0x7f
  define: __INT_FAST16_MAX__=0x7fffffffffffffffL
  define: __INT_FAST32_MAX__=0x7fffffffffffffffL
  define: __INT_FAST64_MAX__=0x7fffffffffffffffL
  define: __UINT_FAST8_MAX__=0xff
  define: __UINT_FAST16_MAX__=0xffffffffffffffffUL
  define: __UINT_FAST32_MAX__=0xffffffffffffffffUL
  define: __UINT_FAST64_MAX__=0xffffffffffffffffUL
  define: __INTPTR_MAX__=0x7fffffffffffffffL
  define: __UINTPTR_MAX__=0xffffffffffffffffUL
  define: __GCC_IEC_559=2
  define: __GCC_IEC_559_COMPLEX=2
  define: __FLT_EVAL_METHOD__=0
  define: __DEC_EVAL_METHOD__=2
  define: __FLT_RADIX__=2
  define: __FLT_MANT_DIG__=24
  define: __FLT_DIG__=6
  define: __FLT_MIN_EXP__=(-125)
  define: __FLT_MIN_10_EXP__=(-37)
  define: __FLT_MAX_EXP__=128
  define: __FLT_MAX_10_EXP__=38
  define: __FLT_DECIMAL_DIG__=9
  define: __FLT_MAX__=3.40282346638528859812e+38F
  define: __FLT_MIN__=1.17549435082228750797e-38F
  define: __FLT_EPSILON__=1.19209289550781250000e-7F
  define: __FLT_DENORM_MIN__=1.40129846432481707092e-45F
  define: __FLT_HAS_DENORM__=1
  define: __FLT_HAS_INFINITY__=1
  define: __FLT_HAS_QUIET_NAN__=1
  define: __DBL_MANT_DIG__=53
  define: __DBL_DIG__=15
  define: __DBL_MIN_EXP__=(-1021)
  define: __DBL_MIN_10_EXP__=(-307)
  define: __DBL_MAX_EXP__=1024
  define: __DBL_MAX_10_EXP__=308
  define: __DBL_DECIMAL_DIG__=17
  define: __DBL_MAX__=((double)1.79769313486231570815e+308L)
  define: __DBL_MIN__=((double)2.22507385850720138309e-308L)
  define: __DBL_EPSILON__=((double)2.22044604925031308085e-16L)
  define: __DBL_DENORM_MIN__=((double)4.94065645841246544177e-324L)
  define: __DBL_HAS_DENORM__=1
  define: __DBL_HAS_INFINITY__=1
  define: __DBL_HAS_QUIET_NAN__=1
  define: __LDBL_MANT_DIG__=64
  define: __LDBL_DIG__=18
  define: __LDBL_MIN_EXP__=(-16381)
  define: __LDBL_MIN_10_EXP__=(-4931)
  define: __LDBL_MAX_EXP__=16384
  define: __LDBL_MAX_10_EXP__=4932
  define: __DECIMAL_DIG__=21
  define: __LDBL_MAX__=1.18973149535723176502e+4932L
  define: __LDBL_MIN__=3.36210314311209350626e-4932L
  define: __LDBL_EPSILON__=1.08420217248550443401e-19L
  define: __LDBL_DENORM_MIN__=3.64519953188247460253e-4951L
  define: __LDBL_HAS_DENORM__=1
  define: __LDBL_HAS_INFINITY__=1
  define: __LDBL_HAS_QUIET_NAN__=1
  define: __DEC32_MANT_DIG__=7
  define: __DEC32_MIN_EXP__=(-94)
  define: __DEC32_MAX_EXP__=97
  define: __DEC32_MIN__=1E-95DF
  define: __DEC32_MAX__=9.999999E96DF
  define: __DEC32_EPSILON__=1E-6DF
  define: __DEC32_SUBNORMAL_MIN__=0.000001E-95DF
  define: __DEC64_MANT_DIG__=16
  define: __DEC64_MIN_EXP__=(-382)
  define: __DEC64_MAX_EXP__=385
  define: __DEC64_MIN__=1E-383DD
  define: __DEC64_MAX__=9.999999999999999E384DD
  define: __DEC64_EPSILON__=1E-15DD
  define: __DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD
  define: __DEC128_MANT_DIG__=34
  define: __DEC128_MIN_EXP__=(-6142)
  define: __DEC128_MAX_EXP__=6145
  define: __DEC128_MIN__=1E-6143DL
  define: __DEC128_MAX__=9.999999999999999999999999999999999E6144DL
  define: __DEC128_EPSILON__=1E-33DL
  define: __DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL
  define: __REGISTER_PREFIX__=
  define: __USER_LABEL_PREFIX__=
  define: __GNUC_STDC_INLINE__=1
  define: __NO_INLINE__=1
  define: __STRICT_ANSI__=1
  define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1=1
  define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2=1
  define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4=1
  define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1
  define: __GCC_ATOMIC_BOOL_LOCK_FREE=2
  define: __GCC_ATOMIC_CHAR_LOCK_FREE=2
  define: __GCC_ATOMIC_CHAR16_T_LOCK_FREE=2
  define: __GCC_ATOMIC_CHAR32_T_LOCK_FREE=2
  define: __GCC_ATOMIC_WCHAR_T_LOCK_FREE=2
  define: __GCC_ATOMIC_SHORT_LOCK_FREE=2
  define: __GCC_ATOMIC_INT_LOCK_FREE=2
  define: __GCC_ATOMIC_LONG_LOCK_FREE=2
  define: __GCC_ATOMIC_LLONG_LOCK_FREE=2
  define: __GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1
  define: __GCC_ATOMIC_POINTER_LOCK_FREE=2
  define: __GCC_HAVE_DWARF2_CFI_ASM=1
  define: __PRAGMA_REDEFINE_EXTNAME=1
  define: __SSP_STRONG__=3
  define: __SIZEOF_INT128__=16
  define: __SIZEOF_WCHAR_T__=4
  define: __SIZEOF_WINT_T__=4
  define: __SIZEOF_PTRDIFF_T__=8
  define: __amd64=1
  define: __amd64__=1
  define: __x86_64=1
  define: __x86_64__=1
  define: __SIZEOF_FLOAT80__=16
  define: __SIZEOF_FLOAT128__=16
  define: __ATOMIC_HLE_ACQUIRE=65536
  define: __ATOMIC_HLE_RELEASE=131072
  define: __k8=1
  define: __k8__=1
  define: __code_model_small__=1
  define: __MMX__=1
  define: __SSE__=1
  define: __SSE2__=1
  define: __FXSR__=1
  define: __SSE_MATH__=1
  define: __SSE2_MATH__=1
  define: __gnu_linux__=1
  define: __linux=1
  define: __linux__=1
  define: __unix=1
  define: __unix__=1
  define: __ELF__=1
  define: __DECIMAL_BID_FORMAT__=1
  define: _STDC_PREDEF_H=1
  define: __STDC_IEC_559__=1
  define: __STDC_IEC_559_COMPLEX__=1
  define: __STDC_ISO_10646__=201505L
  define: __STDC_NO_THREADS__=1
  other: --gcc
  other: --gnu_version=50400
  stdver: --c11
  intelliSenseMode: gcc
Checking for syntax errors: file:///home/dan/Desktop/vscode-test/main.c
queue_update_intellisense for files in tu of: /home/dan/Desktop/vscode-test/main.c
  Processing folder (recursive): /home/dan/Desktop/vscode-test/
  Discovering files: 3870 file(s) processed
  0 file(s) removed from database
Done discovering files.
Populate include completion cache.
Parsing remaining files...
  Parsing: 0 files(s) processed
Done parsing remaining files.
terminating child process: 5258
errorSquiggles count: 1
textDocument/codeAction
textDocument/hover
textDocument/hover
cpptools/textEditorSelectionChange
textDocument/codeAction
cpptools/activeDocumentChange
cpptools/textEditorSelectionChange
cpptools/textEditorSelectionChange
textDocument/codeAction
@bobbrow bobbrow added Language Service investigate: repro This issue's repro steps needs to be investigated/confirmed labels Nov 7, 2018
@bobbrow bobbrow added this to the Triage milestone Nov 7, 2018
@sean-mcmanus
Copy link
Contributor

I repro the issue. It looks like _GNU_SOURCE needs to be defined for c files, not C++. Using gnu11 is supposed to work in terms of the defines that are used, but we could have a bug. You can workaround this bug via adding "_GNU_SOURCE" to the defines section of c_cpp_properties.json (or C_Cpp.default.defines in settings.json).

@sean-mcmanus
Copy link
Contributor

But from what I read at https://exceptionshub.com/_gnu_source-and-__use_gnu.html it sounds like maybe users are expected to define _GNU_SOURCE themselves in their build process or code (I haven't verified that though).

@travisdowns
Copy link

I have this same problem.

The underlying cause seem to be that when cpptools is querying the compiler defines, it passes something like -std=c11 (depending on what you configured in c_cpp_properties.json) to the compiler when it does the gcc -Wp,-v -E -xc -dD /dev/null trick.

The presence of -std=c11 on the command line puts gcc in "strict C mode", and means _GNU_SOURCE (and other important macros that are contingent on that, like _DEFAULT_SOURCE) don't get set. So Intellisense will see an inconsistent view of the world.

Perhaps you be able to set the cStandard in the json to gnu11, so -std=gnu11 can be passed? Or a mode where no standard is passed or something like that.

@sean-mcmanus
Copy link
Contributor

@travisdowns Ah, thanks for the info. Maybe we can add the gnu std versions when we add C++20 versions.

@sean-mcmanus sean-mcmanus added Feature: Configuration An issue related to configuring the extension or IntelliSense and removed investigate: repro This issue's repro steps needs to be investigated/confirmed labels May 2, 2019
@sean-mcmanus sean-mcmanus modified the milestones: Triage, June 2019 May 2, 2019
@travisdowns
Copy link

@sean-mcmanus - thanks!

In the meantime it would be nice to have a bit more visibility into exactly how the cpptools extension is determining the args, e.g., in the debug log it the command line used to invoke gcc doesn't appear, but it would be very useful it it did (since various things are unclear, e.g., if you add to compilerPath an argument, how it gets positioned relative to the arguments that cpptools adds).

@sean-mcmanus
Copy link
Contributor

@travisdowns The user compilerPath args get added to the front of the args that we add, so any "-std" set by the user is overwritten by the one we set.

@bobbrow bobbrow modified the milestones: June 2019, On Deck Jun 11, 2019
@bobbrow bobbrow changed the title Include issue with POSIX C code Support gnu standard versions Sep 27, 2019
@bobbrow bobbrow modified the milestones: On Deck, 1.0.0 Sep 27, 2019
@tchebb
Copy link

tchebb commented Dec 10, 2019

It would be really nice if the generated -std argument was prepended instead of appended to the user-provided arguments. I have a codebase that requires __GNUC__ to be set and __STRICT_ANSI__ to be unset in order for the correct typedefs to exist. Because this extension forces gcc to report its definitions for an ANSI standard, I am unable to get that combination of definitions (and there also doesn't seem to be any way for me to manually undef __STRICT_ANSI__).

The only workaround I've found is to pass bogus arguments to the compiler so that it errors out and doesn't report any definitions at all. Then, I can set the ones I need manually.

tallen1983 added a commit to tallen1983/vscode-cpptools that referenced this issue Dec 18, 2019
Closes microsoft#2782

- Add the ability for the user to pick gnu standards for the cppStandard
and cStandard options.
- While I was in there I added the c17 cStandard that was missing.
@jgunthorpe
Copy link

When the gnu options are supported will they auto configure from the compile_commands.json?

ie my project emits a compile_commands.json that includes -std=gnu11, will all the red squiggles go away once this is fixed? We expect the project to compile in glibc's -D_DEFAULT_SOURCE mode as is the default for all the -std=gnu* options. Not in STRICT_ANSI mode as vs code defaults to.

It is a significant, practicle differnce that was very hard to uncover as being caused by -std.

@sean-mcmanus
Copy link
Contributor

@jgunthorpe If your project uses one "std" then I believe it would work to just set that in the c_cpp_properties.json; however, if you require the "std" to be picked up in the compile_commands.json command arguments, then we would also need to fix #1755 (the workaround for that for non-std flags is to pass the arguments in the compilerPath or compilerArgs properties).

@sean-mcmanus
Copy link
Contributor

The gnu standards are supported now with https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0-insiders2 . Let us know if you hit any issues with that.

@travisdowns
Copy link

The gnu standards are supported now with https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0-insiders2 . Let us know if you hit any issues with that.

Thanks!

Can you give a one-liner one how to use it?

Is it like "cppStandard" : "gnu++17"? The release notes link back here so it would be good to have a brief note about how it's fixed.

@michelleangela
Copy link
Contributor

The GNU standards were added as additional options to properties cStandard and cppStandard. The example you provide is correct usage:
"cppStandard" : "gnu++17"

@sean-mcmanus
Copy link
Contributor

...or "-std=gnu++17" if it's part of compilerArgs, args in compile_commands.json, etc.

@elahehrashedi
Copy link
Contributor

This issue is fixed in 0.28.0.
0.28.0 release: https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Feature: Configuration An issue related to configuring the extension or IntelliSense Feature Request fixed Check the Milestone for the release in which the fix is or will be available. Language Service
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants