diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index 8305b215918..9f68e1f51ee 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -107,12 +107,14 @@ public class AST2BaseTest extends BaseTestCase { map.put("__GNUC__", "4"); map.put("__GNUC_MINOR__", "5"); map.put("__SIZEOF_INT__", "4"); + map.put("__SIZEOF_LONG__", "8"); return map; } private static Map getStdMap() { Map map= new HashMap(); map.put("__SIZEOF_INT__", "4"); + map.put("__SIZEOF_LONG__", "8"); return map; } 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 cbbaeb85a02..26a291eb121 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 @@ -9569,8 +9569,7 @@ public class AST2CPPTests extends AST2BaseTest { // void f(int16_t*) {} // void f(int32_t*) {} // void f(int64_t*) {} - // void f(word_t*) {} - // void test(signed char* i8, short* i16, int* i32, long long* i64, word_t* word) { + // void test(signed char* i8, short* i16, int* i32, long* i64, word_t* word) { // f(i8); // f(i16); // f(i32); @@ -9584,11 +9583,13 @@ public class AST2CPPTests extends AST2BaseTest { for (int i = 0; i < calls.length; i++) { functions[i] = bh.assertNonProblem(calls[i], 1, ICPPFunction.class); } - for (int i = 0; i < functions.length; i++) { - for (int j = i + 1; j < functions.length; j++) { + for (int i = 0; i < functions.length - 1; i++) { + for (int j = 0; j < i ; j++) { assertNotSame(calls[i] + " and " + calls[j] + " resolve to the same function", functions[i], functions[j]); } } + assertSame(calls[calls.length - 1] + " and " + calls[calls.length - 2] + " resolve to different functions", + functions[calls.length - 1], functions[calls.length - 2]); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java index 6d05a310554..6b903cccd04 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java @@ -50,22 +50,22 @@ public class SizeofCalculator { private static final SizeAndAlignment SIZE_1 = new SizeAndAlignment(1, 1); - private final SizeAndAlignment size_2; - private final SizeAndAlignment size_4; - private final SizeAndAlignment size_8; - private final SizeAndAlignment sizeof_pointer; - private final SizeAndAlignment sizeof_int; - private final SizeAndAlignment sizeof_long; - private final SizeAndAlignment sizeof_long_long; - private final SizeAndAlignment sizeof_short; - private final SizeAndAlignment sizeof_bool; - private final SizeAndAlignment sizeof_wchar_t; - private final SizeAndAlignment sizeof_float; - private final SizeAndAlignment sizeof_complex_float; - private final SizeAndAlignment sizeof_double; - private final SizeAndAlignment sizeof_complex_double; - private final SizeAndAlignment sizeof_long_double; - private final SizeAndAlignment sizeof_complex_long_double; + public final SizeAndAlignment size_2; + public final SizeAndAlignment size_4; + public final SizeAndAlignment size_8; + public final SizeAndAlignment sizeof_pointer; + public final SizeAndAlignment sizeof_int; + public final SizeAndAlignment sizeof_long; + public final SizeAndAlignment sizeof_long_long; + public final SizeAndAlignment sizeof_short; + public final SizeAndAlignment sizeof_bool; + public final SizeAndAlignment sizeof_wchar_t; + public final SizeAndAlignment sizeof_float; + public final SizeAndAlignment sizeof_complex_float; + public final SizeAndAlignment sizeof_double; + public final SizeAndAlignment sizeof_complex_double; + public final SizeAndAlignment sizeof_long_double; + public final SizeAndAlignment sizeof_complex_long_double; public SizeofCalculator(IASTTranslationUnit ast) { int maxAlignment = 32; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index 387e509d4c6..e0ed54d939b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -94,7 +94,6 @@ import org.eclipse.cdt.core.parser.util.AttributeUtil; import org.eclipse.cdt.core.parser.util.CharArraySet; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.IContentAssistMatcher; -import org.eclipse.cdt.internal.core.dom.parser.ASTAttribute; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; @@ -102,6 +101,7 @@ import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; +import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator; import org.eclipse.cdt.internal.core.parser.util.ContentAssistMatcherFactory; /** @@ -1283,8 +1283,16 @@ public class CVisitor extends ASTQueries { } else if (CharArrayUtils.equals(mode, "__SI__") || CharArrayUtils.equals(mode, "SI")) { //$NON-NLS-1$ //$NON-NLS-2$ type = new CBasicType(IBasicType.Kind.eInt, getSignModifiers(basicType)); } else if (CharArrayUtils.equals(mode, "__DI__") || CharArrayUtils.equals(mode, "DI")) { //$NON-NLS-1$ //$NON-NLS-2$ + SizeofCalculator sizeofs = new SizeofCalculator(declarator.getTranslationUnit()); + int modifier; + if (sizeofs.sizeof_long != null && sizeofs.sizeof_int != null && + sizeofs.sizeof_long.size == 2 * sizeofs.sizeof_int.size) { + modifier = IBasicType.IS_LONG; + } else { + modifier = IBasicType.IS_LONG_LONG; + } type = new CBasicType(IBasicType.Kind.eInt, - IBasicType.IS_LONG_LONG | getSignModifiers(basicType)); + modifier | getSignModifiers(basicType)); } else if (CharArrayUtils.equals(mode, "__word__") || CharArrayUtils.equals(mode, "word")) { //$NON-NLS-1$ //$NON-NLS-2$ type = new CBasicType(IBasicType.Kind.eInt, IBasicType.IS_LONG | getSignModifiers(basicType)); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 75218d30195..36a9f6d23cf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -158,11 +158,11 @@ import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.AttributeUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; -import org.eclipse.cdt.internal.core.dom.parser.ASTAttribute; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; +import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFieldReference; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionCallExpression; @@ -1865,8 +1865,16 @@ public class CPPVisitor extends ASTQueries { } else if (CharArrayUtils.equals(mode, "__SI__") || CharArrayUtils.equals(mode, "SI")) { //$NON-NLS-1$ //$NON-NLS-2$ type = new CPPBasicType(IBasicType.Kind.eInt, getSignModifiers(basicType)); } else if (CharArrayUtils.equals(mode, "__DI__") || CharArrayUtils.equals(mode, "DI")) { //$NON-NLS-1$ //$NON-NLS-2$ + SizeofCalculator sizeofs = new SizeofCalculator(declarator.getTranslationUnit()); + int modifier; + if (sizeofs.sizeof_long != null && sizeofs.sizeof_int != null && + sizeofs.sizeof_long.size == 2 * sizeofs.sizeof_int.size) { + modifier = IBasicType.IS_LONG; + } else { + modifier = IBasicType.IS_LONG_LONG; + } type = new CPPBasicType(IBasicType.Kind.eInt, - IBasicType.IS_LONG_LONG | getSignModifiers(basicType)); + modifier | getSignModifiers(basicType)); } else if (CharArrayUtils.equals(mode, "__word__") || CharArrayUtils.equals(mode, "word")) { //$NON-NLS-1$ //$NON-NLS-2$ type = new CPPBasicType(IBasicType.Kind.eInt, IBasicType.IS_LONG | getSignModifiers(basicType));