From 9763d3b05863873b0baa19a457d28cc760f83536 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 29 Mar 2017 17:59:29 -0700 Subject: [PATCH] Bug 444577 - __int128_t / __uint128_t not supported (GCC) Change-Id: I3213c7a6ad034c2fac2c96d2e9f88c38d101ed09 --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 13 +++++++++++++ .../core/dom/parser/GCCBuiltinSymbolProvider.java | 15 +++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) 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);