diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 422ffa7f1c9..59becb789f7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -11183,6 +11183,19 @@ public class AST2CPPTests extends AST2TestBase { parseAndCheckBindings(getAboveComment(), CPP, true); } + // // __int128_t and __uint128_t are available but are not keywords. + // void a() { + // __int128_t s; + // __uint128_t t; + // } + // void b() { + // int __int128_t; + // int __uint128_t; + // } + public void testGCCIntBuiltins_444577() throws Exception { + parseAndCheckBindings(getAboveComment(), CPP, true); + } + // template // struct underlying_type { // typedef __underlying_type(T) type; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java index 643ab39bcc1..3d387ebe072 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java @@ -84,8 +84,8 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider { private void initialize() { // Symbols for all parsers - fTypeMap= new HashMap(); - fBindingList= new ArrayList(); + fTypeMap= new HashMap<>(); + fBindingList= new ArrayList<>(); addStdBuiltins(); if (fGnu) { addGnuBuiltins(); @@ -103,6 +103,10 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider { } private void addGnuBuiltins() { + // Undocumented GCC built-ins also supported by Clang. + typedef("__int128", "__int128_t"); + typedef("unsigned __int128", "__uint128_t"); + // Used in stdtypes.h, mentioned in the manual but not defined in there. typedef("va_list", "__builtin_va_list"); function("void*", "__builtin_va_start", "va_list", "..."); @@ -501,13 +505,13 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider { private IType createType(final String type) { String tstr= type; if (fCpp && tstr.endsWith("&")) { - final String nested = tstr.substring(0, tstr.length()-1).trim(); + final String nested = tstr.substring(0, tstr.length() - 1).trim(); return new CPPReferenceType(toType(nested), false); } if (tstr.equals("FILE*")) { return toType("void*"); } else if (tstr.endsWith("*")) { - final String nested = tstr.substring(0, tstr.length()-1).trim(); + final String nested = tstr.substring(0, tstr.length() - 1).trim(); final IType nt= toType(nested); return fCpp ? new CPPPointerType(nt) : new CPointerType(nt, 0); } @@ -557,6 +561,9 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider { } else if (tstr.equals("int")) { Kind kind = Kind.eInt; t = fCpp ? new CPPBasicType(kind, q) : new CBasicType(kind, q); + } else if (tstr.equals("__int128")) { + Kind kind = Kind.eInt128; + t = fCpp ? new CPPBasicType(kind, q) : new CBasicType(kind, q); } else if (tstr.equals("float")) { Kind kind = Kind.eFloat; t = fCpp ? new CPPBasicType(kind, q) : new CBasicType(kind, q);