blob: 7baa2c44c6fdf77e3e6a36a834c9aecb6923c1cd [file] [log] [blame]
/*******************************************************************************
* 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);
}
}