diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/GCCCompleteParseExtensionsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/GCCCompleteParseExtensionsTest.java index d170900ee05..907d66c80ae 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/GCCCompleteParseExtensionsTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/GCCCompleteParseExtensionsTest.java @@ -474,4 +474,13 @@ public void test__attribute__aligned_bug400204() throws Exception { parseGCC(code); parseGPP(code); } + + // void test() { + // !__builtin_add_overflow_p(1,2,3); + // } + public void testIntegerOverflowBuiltin_bug271() throws Exception { + String code = getAboveComment(); + parseGCC(code); + parseGPP(code); + } } 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 70811ca13ac..b8f895c1895 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 @@ -190,6 +190,20 @@ private void addGnuBuiltins() { function("bool", "__atomic_always_lock_free", "size_t", "void*"); function("bool", "__atomic_is_lock_free", "size_t", "void*"); + // Integer Overflow Builtins (https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html) + for (String op : new String[] { "add", "sub", "mul" }) { + function("bool", "__builtin_" + op + "_overflow", "", "", "void*"); + function("bool", "__builtin_" + op + "_overflow_p", "", "", ""); + function("bool", "__builtin_s" + op + "_overflow", "int", "int", "int*"); + function("bool", "__builtin_s" + op + "l_overflow", "long int", "long int", "long int*"); + function("bool", "__builtin_s" + op + "ll_overflow", "long long int", "long long int", "long long int*"); + function("bool", "__builtin_u" + op + "_overflow", "unsigned int", "unsigned int", "unsigned int*"); + function("bool", "__builtin_u" + op + "l_overflow", "unsigned long int", "unsigned long int", + "unsigned long int*"); + function("bool", "__builtin_u" + op + "ll_overflow", "unsigned long long int", "unsigned long long int", + "unsigned long long int*"); + } + ICPPExecution builtinFfs = new ExecBuiltin(ExecBuiltin.BUILTIN_FFS); ICPPExecution builtinFfsl = new ExecBuiltin(ExecBuiltin.BUILTIN_FFSL); ICPPExecution builtinFfsll = new ExecBuiltin(ExecBuiltin.BUILTIN_FFSLL);