1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-31 21:05:37 +02:00

Bug 568427 - 'alloca' not resolved when parsing in the context of clang-cl

Don't define __STDC__ for clang-cl, just like msvc. Added a new compiler
type to differentiate clang-cl from clang in order to be able to add the
define just for clang and not clang-cl. I initially thought that the
unresolved symbol was caused by a missing built-in symbol (_alloca) so I
started to implement MSVC as a separate language from GNU and not
pollute GCCBuiltinSymbolProvider with a new concept of compiler type,
etc. But it turns out _alloca is also in declared in the headers and was
inactive because of the wrongly defined __STDC__. So this version of the
fix of adding a compiler type to GPPScannerExtensionConfiguration is
much less intrusive and risky, although adding a new language could have
its merit in case of more substantial change.

Change-Id: Ieb27b7dbcc531b8fd3fe30777cd7f343fd3ba66f
Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com>
This commit is contained in:
Marc-Andre Laperle 2020-11-02 00:37:31 -05:00
parent aff9a3332d
commit 4a83dbfbdd
2 changed files with 12 additions and 6 deletions

View file

@ -56,6 +56,7 @@ public class GCCScannerExtensionConfiguration extends GNUScannerExtensionConfigu
String mscVer = definedSymbols.get("_MSC_VER"); //$NON-NLS-1$ String mscVer = definedSymbols.get("_MSC_VER"); //$NON-NLS-1$
if (mscVer != null && Integer.valueOf(mscVer) > 0) { if (mscVer != null && Integer.valueOf(mscVer) > 0) {
// Note: this is also used for clang-cl.
return CONFIG_MSVC; return CONFIG_MSVC;
} }

View file

@ -32,7 +32,7 @@ import org.eclipse.cdt.core.parser.Keywords;
*/ */
public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfiguration { public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfiguration {
private static enum CompilerType { private static enum CompilerType {
GCC, Clang, MSVC GCC, Clang, ClangCl, MSVC
} }
private static final int VERSION_4_2 = version(4, 2); private static final int VERSION_4_2 = version(4, 2);
@ -54,6 +54,8 @@ public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfigu
private static GPPScannerExtensionConfiguration CONFIG_10_0 = new GPPScannerExtensionConfiguration(VERSION_10_0); private static GPPScannerExtensionConfiguration CONFIG_10_0 = new GPPScannerExtensionConfiguration(VERSION_10_0);
private static GPPScannerExtensionConfiguration CONFIG_CLANG = new GPPScannerExtensionConfiguration( private static GPPScannerExtensionConfiguration CONFIG_CLANG = new GPPScannerExtensionConfiguration(
CompilerType.Clang, 0 /* version is ignored for now */); CompilerType.Clang, 0 /* version is ignored for now */);
private static GPPScannerExtensionConfiguration CONFIG_CLANG_CL = new GPPScannerExtensionConfiguration(
CompilerType.ClangCl, 0 /* version is ignored for now */);
private static GPPScannerExtensionConfiguration CONFIG_MSVC = new GPPScannerExtensionConfiguration( private static GPPScannerExtensionConfiguration CONFIG_MSVC = new GPPScannerExtensionConfiguration(
CompilerType.MSVC, 0 /* version is ignored for now */); CompilerType.MSVC, 0 /* version is ignored for now */);
@ -69,14 +71,17 @@ public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfigu
try { try {
final Map<String, String> definedSymbols = info.getDefinedSymbols(); final Map<String, String> definedSymbols = info.getDefinedSymbols();
// Clang. Needs to be checked first since it pretends to be GCC too. // Clang. Needs to be checked first since it pretends to be GCC and MSVC too.
String clang = definedSymbols.get("__clang__"); //$NON-NLS-1$ String clang = definedSymbols.get("__clang__"); //$NON-NLS-1$
String mscVer = definedSymbols.get("_MSC_VER"); //$NON-NLS-1$
boolean hasMsc = mscVer != null && Integer.valueOf(mscVer) > 0;
if (clang != null && Integer.valueOf(clang) > 0) { if (clang != null && Integer.valueOf(clang) > 0) {
if (hasMsc)
return CONFIG_CLANG_CL;
return CONFIG_CLANG; return CONFIG_CLANG;
} }
String mscVer = definedSymbols.get("_MSC_VER"); //$NON-NLS-1$ if (hasMsc) {
if (mscVer != null && Integer.valueOf(mscVer) > 0) {
return CONFIG_MSVC; return CONFIG_MSVC;
} }
@ -137,7 +142,7 @@ public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfigu
addKeyword(Keywords.c_COMPLEX, IToken.t__Complex); addKeyword(Keywords.c_COMPLEX, IToken.t__Complex);
addKeyword(Keywords.c_IMAGINARY, IToken.t__Imaginary); addKeyword(Keywords.c_IMAGINARY, IToken.t__Imaginary);
if (compiler != CompilerType.MSVC) { if (!(compiler == CompilerType.MSVC || compiler == CompilerType.ClangCl)) {
// MSVC only defines this when compiling in C mode and /Za is used. // MSVC only defines this when compiling in C mode and /Za is used.
addMacro("__STDC__", "1"); addMacro("__STDC__", "1");
} }
@ -193,7 +198,7 @@ public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfigu
if (version >= VERSION_10_0) { if (version >= VERSION_10_0) {
addKeyword(GCCKeywords.cp__is_same, IGCCToken.tTT_is_same); addKeyword(GCCKeywords.cp__is_same, IGCCToken.tTT_is_same);
} }
} else if (compiler == CompilerType.Clang) { } else if (compiler == CompilerType.Clang || compiler == CompilerType.ClangCl) {
// As documented at // As documented at
// http://clang.llvm.org/docs/LanguageExtensions.html#checks-for-type-trait-primitives. // http://clang.llvm.org/docs/LanguageExtensions.html#checks-for-type-trait-primitives.
// For now we don't make it dependent on the version. // For now we don't make it dependent on the version.