/******************************************************************************* * Copyright (c) 2009, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.parser.xlc.tests; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPref; public class XlcExtensionsTest extends XlcTestBase { public XlcExtensionsTest() { } public XlcExtensionsTest(String name) { super(name); } public void testHexadecimalFloatingPointLiterals() throws Exception { String code = "int test() { \n"+ " 0x0A2B.0FDp+2f; \n"+ " 0X12D.p-44F; \n"+ " 0xBACP+2L; \n"+ "}\n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testFuncPredefinedIdentifier() { String code = "void test() { \n" + " __func__; \n" + " } \n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testStringConcatenation() { String code = "void test() { \n" + " \"hello \" \"there\"; \n" + " \"hello \" L\"there\"; \n" + " } \n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testLongLong() { String code = "void test() { \n" + " long long x; \n" + " } \n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testComplex() { String code = "void test() { \n" + " float _Complex x; \n" + " double _Complex y; \n" + " long double _Complex z; \n" + " } \n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testBool() { String code = "_Bool f(int a, int b) { \n" + " return a==b; \n" + " } \n"; parse(code, getCLanguage(), true); } public void testTrailingCommaInEnum() { String code = "void test() { \n" + " enum grain { oats, wheat, barley, corn, rice, }; \n" + " } \n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testNonLValueArraySubscript() { String code = "struct trio{int a[3];}; \n" + "struct trio f(); \n" + "foo (int index) \n" + "{ \n" + " return f().a[index]; \n" + "} \n"; parse(code, getCLanguage(), true); } public void testStaticArrayIndices() { String code = "void test() { \n" + " void foo1(int arr [static 10]); \n" + " int i = 10; \n" + " void foo2(int arr [static const i]); \n" + " } \n"; parse(code, getCLanguage(), true); } public void testFunctionLikeMacrosVariableArguments() { String code = "#define debug(...) fprintf(stderr, __VA_ARGS__) \n" + "int test() { \n" + " debug(\"flag\"); \n" + " } \n"; parse(code, getCLanguage(), false); } public void testFunctionLikeMacrosEmptyArgument() { String code = "#define SUM(a,b,c) a + b + c \n" + "int test() { \n" + " SUM(1,,3); \n" + " } \n"; parse(code, getCLanguage(), true); } public void testPredefinedMacroNamesC() { String code = "void test() { \n" + " __DATE__; \n" + " __FILE__; \n" + " __LINE__; \n" + " __STDC_HOSTED__; \n" + " __STDC_VERSION__; \n" + " __TIME__; \n" + "} \n"; parse(code, getCLanguage(), true); } public void testPredefinedMacroNamesCpp() { String code = "void test() { \n" + " __DATE__; \n" + " __FILE__; \n" + " __LINE__; \n" + " __TIME__; \n" + // " __cplusplus; \n" + "} \n"; parse(code, getCPPLanguage(), true); } public void testCompoundLiterals() { String code = "void test() { \n" + " drawline((struct point){6,7}); \n" + " } \n"; parse(code, getCLanguage(), false); } public void testPragma() { String code = "void test() { \n" + " _Pragma ( \"pack(full)\" ) \n" + " } \n"; parse(code, getCLanguage(), true); } public void testStandardPragmas() { String code = "#pragma STDC FP_CONTRACT ON \n" + "#pragma STDC FENV_ACCESS OFF \n" + "#pragma STDC CX_LIMITED_RANGE DEFAULT \n"; parse(code, getCLanguage(), true); } public void testLineDirective() { String code = "#define LINE200 200 \n" + "#line 100 \n" + "#line LINE200 \n"; parse(code, getCLanguage(), true); } /** * https://bugs.eclipse.org/bugs/show_bug.cgi?id=228826 * http://publib.boulder.ibm.com/infocenter/comphelp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.aix.doc/language_ref/restrict_type_qualifier.html * * TODO Need a properties page so that things like this can be configured by the user. */ public void testRestrictC() { String code = "void foo(int n, int * restrict a, int * __restrict b, int * __restrict__ c) {} "; parse(code, getCLanguage(), true); } public void testRestrictCPPOn() { String code = "void foo(int n, int * restrict a, int * __restrict b, int * __restrict__ c) {} "; parse(code, getCPPLanguage(), true); } public void testRestrictCPPOff() { XlcLanguagePreferences.setWorkspacePreference(XlcPref.SUPPORT_RESTRICT_IN_CPP, String.valueOf(false)); String code = "void restrict(); \n " + "void foo(int n, int * __restrict b, int * __restrict__ c) {} "; parse(code, getCPPLanguage(), true); } public void testUTFLiterals() { String code = "void test() { \n " + " u\"ucs characters \\u1234 and \\u8180 \"; \n " + " U\"ucs characters \\u1234 and \\u8180 \"; \n " + " U\"concatenation \\u1234 \" u\"is allowed \\u8180 \"; \n " + " u'\\u1234'; \n " + " U'\\u1234'; \n " + "}"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testFloatingPointTypes() { String code = " _Decimal32 x = 22.2df; \n " + " _Decimal64 y = 33.3dd; \n " + " _Decimal128 z = 33.3dl; \n "; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } public void testVariableLengthArrays() { String code = "double maximum1(int n, int m, double a[n][m]);\n" + "double maximum2(int n, int m, double a[*][*]);\n" + "double maximum3(int n, int m, double a[ ][*]);\n" + "double maximum4(int n, int m, double a[ ][m]);\n"; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); // xlc supports this in C++ } public void testV11Attributes() { String code = "#define __inline__ __inline__ __attribute__((gnu_inline)) \n" + "static int w() __attribute__ ((weakref (\"y\")));\n" + /* is equivalent to... */ "static int x() __attribute__ ((weak, weakref, alias (\"y\")));\n" + /* and to... */ "static int y() __attribute__ ((weakref));\n" + "static int z() __attribute__ ((alias (\"y\"))); \n" + "int foo() __attribute__((gnu_inline)); \n" + "static inline __attribute__((gnu_inline)) int ins (int *a){ \n" + " (*a)++; \n" + "} \n" + "inline __attribute__((gnu_inline)) int inc (int *a){ \n" + " (*a)++; \n" + "} "; parse(code, getCLanguage(), true); parse(code, getCPPLanguage(), true); } }