microsoft / vscode-cpptools

Official repository for the Microsoft C/C++ extension for VS Code.
Other
5.53k stars 1.55k forks source link

constexpr erroneous intellisense problem #5279

Open foreignrobot opened 4 years ago

foreignrobot commented 4 years ago

Type: LanguageService

Describe the bug

A constexpr assignment based on a class member variable (Eigen::Matrix2d) generates an erroneous Intellisense problem ('this' cannot be used in a constant expression). The code compiles successfully with gcc 7.5 even when using -Wall -Werror.

Steps to reproduce Minimal example:

#include <iostream>
#include <Eigen/Core>
class Foo
{
    Eigen::Matrix2d mat1;
public:
    void matsize();
};
void Foo::matsize()
{
    constexpr int colsize_ = mat1.ColsAtCompileTime;
    std::cout << "colsize: " << colsize_ << std::endl;
}
int main()
{
    Foo test1;
    test1.matsize();
}

Expected behavior No error given by Intellisense

Logs ``` 1. Log Diagnostics -------- Diagnostics - 4/10/2020, 6:01:32 PM Version: 0.27.0 Current Configuration: { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/usr/include/eigen3/" ], "defines": [], "compilerPath": "/usr/bin/gcc", "cStandard": "c11", "cppStandard": "c++11", "compilerArgs": [], "intelliSenseMode": "gcc-x64", "browse": { "path": [ "${workspaceFolder}/**", "/usr/include/eigen3/" ], "limitSymbolsToIncludedHeaders": true } } Translation Unit Mappings: [ /home/user/tests/constexprex.cpp ]: /home/user/tests/constexprex.cpp Translation Unit Configurations: [ /home/user/tests/constexprex.cpp ]: Process ID: 17957 Memory Usage: 172 MB Compiler Path: /usr/bin/gcc Includes: /usr/include/eigen3 /usr/include/c++/7 /usr/include/x86_64-linux-gnu/c++/7 /usr/include/c++/7/backward /usr/lib/gcc/x86_64-linux-gnu/7/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed /usr/include/x86_64-linux-gnu /usr/include Standard Version: c++11 IntelliSense Mode: gcc-x64 Other Flags: --g++ --gnu_version=70500 Total Memory Usage: 172 MB 2. Log from the language server sending compilation args for /home/user/tests/constexprex.cpp include: /usr/include/eigen3 include: /usr/include/c++/7 include: /usr/include/x86_64-linux-gnu/c++/7 include: /usr/include/c++/7/backward include: /usr/lib/gcc/x86_64-linux-gnu/7/include include: /usr/local/include include: /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed include: /usr/include/x86_64-linux-gnu include: /usr/include define: __STDC__=1 define: __cplusplus=201103L define: __STDC_UTF_16__=1 define: __STDC_UTF_32__=1 define: __STDC_HOSTED__=1 define: __GNUC__=7 define: __GNUC_MINOR__=5 define: __GNUC_PATCHLEVEL__=0 define: __VERSION__="7.5.0" 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: __pic__=2 define: __PIC__=2 define: __pie__=2 define: __PIE__=2 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: __GNUG__=7 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: __GXX_WEAK__=1 define: __DEPRECATED=1 define: __GXX_RTTI=1 define: __GXX_EXPERIMENTAL_CXX0X__=1 define: __EXCEPTIONS=1 define: __GXX_ABI_VERSION=1011 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: __SCHAR_WIDTH__=8 define: __SHRT_WIDTH__=16 define: __INT_WIDTH__=32 define: __LONG_WIDTH__=64 define: __LONG_LONG_WIDTH__=64 define: __WCHAR_WIDTH__=32 define: __WINT_WIDTH__=32 define: __PTRDIFF_WIDTH__=64 define: __SIZE_WIDTH__=64 define: __INTMAX_MAX__=0x7fffffffffffffffL define: __INTMAX_C(c)=c ## L define: __UINTMAX_MAX__=0xffffffffffffffffUL define: __UINTMAX_C(c)=c ## UL define: __INTMAX_WIDTH__=64 define: __SIG_ATOMIC_MAX__=0x7fffffff define: __SIG_ATOMIC_MIN__=(-__SIG_ATOMIC_MAX__ - 1) define: __SIG_ATOMIC_WIDTH__=32 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_LEAST8_WIDTH__=8 define: __INT_LEAST16_MAX__=0x7fff define: __INT16_C(c)=c define: __INT_LEAST16_WIDTH__=16 define: __INT_LEAST32_MAX__=0x7fffffff define: __INT32_C(c)=c define: __INT_LEAST32_WIDTH__=32 define: __INT_LEAST64_MAX__=0x7fffffffffffffffL define: __INT64_C(c)=c ## L define: __INT_LEAST64_WIDTH__=64 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_FAST8_WIDTH__=8 define: __INT_FAST16_MAX__=0x7fffffffffffffffL define: __INT_FAST16_WIDTH__=64 define: __INT_FAST32_MAX__=0x7fffffffffffffffL define: __INT_FAST32_WIDTH__=64 define: __INT_FAST64_MAX__=0x7fffffffffffffffL define: __INT_FAST64_WIDTH__=64 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: __INTPTR_WIDTH__=64 define: __UINTPTR_MAX__=0xffffffffffffffffUL define: __GCC_IEC_559=2 define: __GCC_IEC_559_COMPLEX=2 define: __FLT_EVAL_METHOD__=0 define: __FLT_EVAL_METHOD_TS_18661_3__=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.40282346638528859811704183484516925e+38F define: __FLT_MIN__=1.17549435082228750796873653722224568e-38F define: __FLT_EPSILON__=1.19209289550781250000000000000000000e-7F define: __FLT_DENORM_MIN__=1.40129846432481707092372958328991613e-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.79769313486231570814527423731704357e+308L) define: __DBL_MIN__=double(2.22507385850720138309023271733240406e-308L) define: __DBL_EPSILON__=double(2.22044604925031308084726333618164062e-16L) define: __DBL_DENORM_MIN__=double(4.94065645841246544176568792868221372e-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_DECIMAL_DIG__=21 define: __LDBL_MAX__=1.18973149535723176502126385303097021e+4932L define: __LDBL_MIN__=3.36210314311209350626267781732175260e-4932L define: __LDBL_EPSILON__=1.08420217248550443400745280086994171e-19L define: __LDBL_DENORM_MIN__=3.64519953188247460252840593361941982e-4951L define: __LDBL_HAS_DENORM__=1 define: __LDBL_HAS_INFINITY__=1 define: __LDBL_HAS_QUIET_NAN__=1 define: __FLT32_MANT_DIG__=24 define: __FLT32_DIG__=6 define: __FLT32_MIN_EXP__=(-125) define: __FLT32_MIN_10_EXP__=(-37) define: __FLT32_MAX_EXP__=128 define: __FLT32_MAX_10_EXP__=38 define: __FLT32_DECIMAL_DIG__=9 define: __FLT32_MAX__=3.40282346638528859811704183484516925e+38F32 define: __FLT32_MIN__=1.17549435082228750796873653722224568e-38F32 define: __FLT32_EPSILON__=1.19209289550781250000000000000000000e-7F32 define: __FLT32_DENORM_MIN__=1.40129846432481707092372958328991613e-45F32 define: __FLT32_HAS_DENORM__=1 define: __FLT32_HAS_INFINITY__=1 define: __FLT32_HAS_QUIET_NAN__=1 define: __FLT64_MANT_DIG__=53 define: __FLT64_DIG__=15 define: __FLT64_MIN_EXP__=(-1021) define: __FLT64_MIN_10_EXP__=(-307) define: __FLT64_MAX_EXP__=1024 define: __FLT64_MAX_10_EXP__=308 define: __FLT64_DECIMAL_DIG__=17 define: __FLT64_MAX__=1.79769313486231570814527423731704357e+308F64 define: __FLT64_MIN__=2.22507385850720138309023271733240406e-308F64 define: __FLT64_EPSILON__=2.22044604925031308084726333618164062e-16F64 define: __FLT64_DENORM_MIN__=4.94065645841246544176568792868221372e-324F64 define: __FLT64_HAS_DENORM__=1 define: __FLT64_HAS_INFINITY__=1 define: __FLT64_HAS_QUIET_NAN__=1 define: __FLT128_MANT_DIG__=113 define: __FLT128_DIG__=33 define: __FLT128_MIN_EXP__=(-16381) define: __FLT128_MIN_10_EXP__=(-4931) define: __FLT128_MAX_EXP__=16384 define: __FLT128_MAX_10_EXP__=4932 define: __FLT128_DECIMAL_DIG__=36 define: __FLT128_MAX__=1.18973149535723176508575932662800702e+4932F128 define: __FLT128_MIN__=3.36210314311209350626267781732175260e-4932F128 define: __FLT128_EPSILON__=1.92592994438723585305597794258492732e-34F128 define: __FLT128_DENORM_MIN__=6.47517511943802511092443895822764655e-4966F128 define: __FLT128_HAS_DENORM__=1 define: __FLT128_HAS_INFINITY__=1 define: __FLT128_HAS_QUIET_NAN__=1 define: __FLT32X_MANT_DIG__=53 define: __FLT32X_DIG__=15 define: __FLT32X_MIN_EXP__=(-1021) define: __FLT32X_MIN_10_EXP__=(-307) define: __FLT32X_MAX_EXP__=1024 define: __FLT32X_MAX_10_EXP__=308 define: __FLT32X_DECIMAL_DIG__=17 define: __FLT32X_MAX__=1.79769313486231570814527423731704357e+308F32x define: __FLT32X_MIN__=2.22507385850720138309023271733240406e-308F32x define: __FLT32X_EPSILON__=2.22044604925031308084726333618164062e-16F32x define: __FLT32X_DENORM_MIN__=4.94065645841246544176568792868221372e-324F32x define: __FLT32X_HAS_DENORM__=1 define: __FLT32X_HAS_INFINITY__=1 define: __FLT32X_HAS_QUIET_NAN__=1 define: __FLT64X_MANT_DIG__=64 define: __FLT64X_DIG__=18 define: __FLT64X_MIN_EXP__=(-16381) define: __FLT64X_MIN_10_EXP__=(-4931) define: __FLT64X_MAX_EXP__=16384 define: __FLT64X_MAX_10_EXP__=4932 define: __FLT64X_DECIMAL_DIG__=21 define: __FLT64X_MAX__=1.18973149535723176502126385303097021e+4932F64x define: __FLT64X_MIN__=3.36210314311209350626267781732175260e-4932F64x define: __FLT64X_EPSILON__=1.08420217248550443400745280086994171e-19F64x define: __FLT64X_DENORM_MIN__=3.64519953188247460252840593361941982e-4951F64x define: __FLT64X_HAS_DENORM__=1 define: __FLT64X_HAS_INFINITY__=1 define: __FLT64X_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: __GCC_ASM_FLAG_OUTPUTS__=1 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: __SEG_FS=1 define: __SEG_GS=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: _GNU_SOURCE=1 define: _STDC_PREDEF_H=1 define: __STDC_IEC_559__=1 define: __STDC_IEC_559_COMPLEX__=1 define: __STDC_ISO_10646__=201706L define: __STDC_NO_THREADS__=1 other: --g++ other: --gnu_version=70500 Checking for syntax errors: file:///home/user/tests/constexprex.cpp Queueing IntelliSense update for files in translation unit of: /home/user/tests/constexprex.cpp idle loop: reparsing the active document Checking for syntax errors: file:///home/user/tests/constexprex.cpp Queueing IntelliSense update for files in translation unit of: /home/user/tests/constexprex.cpp Error squiggle count: 1 terminating child process: 26262 Error squiggle count: 1 Update IntelliSense time (sec): 0.643 ```

Screenshots

constexprex cpp - tests - Visual Studio Code_025

Additional context

sean-mcmanus commented 4 years ago

Thanks for reporting this. The bug is from shared code with Visual Studio so I've filed a bug at https://developercommunity.visualstudio.com/content/problem/986700/c-intellisense-gives-incorrect-this-cannot-be-used.html .

foreignrobot commented 4 years ago

Thanks for filing a bug. Unfortunately, the link that you provided doesn't seem to work.

sean-mcmanus commented 4 years ago

9 duplicate bugs got created (https://developercommunity.visualstudio.com/content/problem/986759/urgent-vs-is-generating-1-bug-report-every-minute.html ...seems that link is internal so it might not work) and in the process of deleting the duplicates, they deleted the original, so the new bug tracking it is https://developercommunity.visualstudio.com/content/problem/986731/c-intellisense-gives-incorrect-this-cannot-be-used-1.html .

dhebbeker commented 2 years ago

The code in the example does not compile with clang 13.0.1 (test with Compiler Explorer).

<source>:11:16: error: constexpr variable 'colsize_' must be initialized by a constant expression
        constexpr int colsize_ = mat1.ColsAtCompileTime;
                      ^          ~~~~~~~~~~~~~~~~~~~~~~
<source>:11:27: note: implicit use of 'this' pointer is only allowed within the evaluation of a call to a 'constexpr' member function
        constexpr int colsize_ = mat1.ColsAtCompileTime;
                                 ^
1 error generated.

Apply this patch (requires RTTI):

11c11
<   constexpr int colsize_ = mat1.ColsAtCompileTime;
---
>   constexpr int colsize_ = decltype(mat1)::ColsAtCompileTime;

or this:

11c11
<   constexpr int colsize_ = mat1.ColsAtCompileTime;
---
>   constexpr int colsize_ = Eigen::Matrix2d::ColsAtCompileTime;

Then clang will compile it free of errors.

Is it maybe, that gcc allows non-standard compliant code?

sean-mcmanus commented 2 years ago

@dhebbeker Yes, it seems like clang is correct and gcc/cl.exe are non-compliant (either due to a bug or extension)...although our IntelliSense parser is (ideally) supposed to mimic the particular compiler's behavior (even when it's technically incorrect).