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 16fb32bfea9..495b19abb49 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 @@ -381,4 +381,31 @@ public class GCCCompleteParseExtensionsTest extends AST2BaseTest { parseGPP( writer.toString() ); } + // typedef int size_t; // will be defined in + // struct S {int m;}; + // void test() { + // int a= __builtin_offsetof(struct S, m); + // }; + public void test__builtinOffsetof_Bug265001() throws Exception { + // gcc with __GNUC__ >= 4 defines: + // #define offsetof(type, field) __builtin_offsetof(type, field) + + String code= getAboveComment(); + parseGCC(code); + parseGPP(code); + } + + // typedef struct S {int m;} T; + // void test() { + // int a= __offsetof__(1); + // }; + public void test__offsetof__Bug265001() throws Exception { + // gcc with __GNUC__ < 4 defines: + // #define offsetof(type, field) \ + // (__offsetof__ (reinterpret_cast <__size_t> \ + // (& reinterpret_cast \ + // (static_cast (0)->field)))) + String code= getAboveComment(); + parseGPP(code); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/GNUScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/GNUScannerExtensionConfiguration.java index edb9211a80a..a5b6acdd0b7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/GNUScannerExtensionConfiguration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/GNUScannerExtensionConfiguration.java @@ -40,7 +40,8 @@ public abstract class GNUScannerExtensionConfiguration extends AbstractScannerEx addMacro("__builtin_va_arg(ap,type)", "*(type *)ap"); addMacro("__builtin_constant_p(exp)", "0"); addMacro("__builtin_types_compatible_p(x,y)", "__builtin_types_compatible_p(sizeof(x),sizeof(y))"); - + addMacro("__offsetof__(x)", "(x)"); + addPreprocessorKeyword(Keywords.cINCLUDE_NEXT, IPreprocessorDirective.ppInclude_next); addPreprocessorKeyword(Keywords.cIMPORT, IPreprocessorDirective.ppImport); addPreprocessorKeyword(Keywords.cWARNING, IPreprocessorDirective.ppWarning); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java index 02612b6c5e3..30d89ec03ab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java @@ -28,9 +28,11 @@ public class GCCScannerExtensionConfiguration extends GNUScannerExtensionConfigu return sInstance; } + @SuppressWarnings("nls") public GCCScannerExtensionConfiguration() { - addMacro("__null", "(void *)0"); //$NON-NLS-1$//$NON-NLS-2$ - addMacro("_Pragma(arg)", ""); //$NON-NLS-1$//$NON-NLS-2$ + addMacro("__null", "(void *)0"); + addMacro("_Pragma(arg)", ""); + addMacro("__builtin_offsetof(T,m)", "((size_t) &((T *)0)->m)"); } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java index d3f8db54758..009359517c7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/cpp/GPPScannerExtensionConfiguration.java @@ -31,8 +31,10 @@ public class GPPScannerExtensionConfiguration extends GNUScannerExtensionConfigu return sInstance; } + @SuppressWarnings("nls") public GPPScannerExtensionConfiguration() { - addMacro("__null", "0"); //$NON-NLS-1$//$NON-NLS-2$ + addMacro("__null", "0"); + addMacro("__builtin_offsetof(T,m)", "(reinterpret_cast (&reinterpret_cast (static_cast (0)->m)))"); addKeyword(Keywords.c_COMPLEX, IToken.t__Complex); addKeyword(Keywords.c_IMAGINARY, IToken.t__Imaginary); }