1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 14:12:10 +02:00

Bug 315435 Fix the regression test failures in cdt70

This commit is contained in:
Vivian Kong 2010-06-02 19:35:43 +00:00
parent c2d90006b5
commit 0890f7c49e
25 changed files with 274 additions and 68 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2009 IBM Corporation and others. * Copyright (c) 2006, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -24,7 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
@ -172,14 +172,14 @@ public class LRDigraphTrigraphTests extends TestCase {
IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration)((IASTDeclarationStatement)statements[0]).getDeclaration(); IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration)((IASTDeclarationStatement)statements[0]).getDeclaration();
IASTDeclarator declarator1 = decl1.getDeclarators()[0]; IASTDeclarator declarator1 = decl1.getDeclarators()[0];
assertEquals("xy", declarator1.getName().toString()); assertEquals("xy", declarator1.getName().toString());
IASTLiteralExpression expr1 = (IASTLiteralExpression)((IASTInitializerExpression)declarator1.getInitializer()).getExpression(); IASTLiteralExpression expr1 = (IASTLiteralExpression)((IASTEqualsInitializer)declarator1.getInitializer()).getInitializerClause();
assertEquals(IASTLiteralExpression.lk_string_literal, expr1.getKind()); assertEquals(IASTLiteralExpression.lk_string_literal, expr1.getKind());
assertEquals("\"its all good\"", expr1.toString()); assertEquals("\"its all good\"", expr1.toString());
IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration)((IASTDeclarationStatement)statements[1]).getDeclaration(); IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration)((IASTDeclarationStatement)statements[1]).getDeclaration();
IASTDeclarator declarator2 = decl2.getDeclarators()[0]; IASTDeclarator declarator2 = decl2.getDeclarators()[0];
assertEquals("ab", declarator2.getName().toString()); assertEquals("ab", declarator2.getName().toString());
IASTLiteralExpression expr2 = (IASTLiteralExpression)((IASTInitializerExpression)declarator2.getInitializer()).getExpression(); IASTLiteralExpression expr2 = (IASTLiteralExpression)((IASTEqualsInitializer)declarator2.getInitializer()).getInitializerClause();
assertEquals(IASTLiteralExpression.lk_string_literal, expr2.getKind()); assertEquals(IASTLiteralExpression.lk_string_literal, expr2.getKind());
assertEquals("\"its still good\"", expr2.toString()); assertEquals("\"its still good\"", expr2.toString());
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2009 IBM Corporation and others. * Copyright (c) 2006, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -24,9 +24,12 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.FileContent;
import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IncludeFileContentProvider;
import org.eclipse.cdt.core.parser.ParserUtil; import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.tests.ast2.AST2BaseTest;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -127,14 +130,15 @@ public class ParseHelper {
public static IASTTranslationUnit parse(char[] code, ILanguage lang, Options options) { public static IASTTranslationUnit parse(char[] code, ILanguage lang, Options options) {
CodeReader codeReader = new CodeReader(code);
return parse(codeReader, lang, new ScannerInfo(), null, options); return parse(FileContent.create(AST2BaseTest.TEST_CODE, code), lang, new ScannerInfo(), null, options);
} }
/** /**
* TODO thats WAY too many parameters, need to use a parameter object, need to refactor the * TODO thats WAY too many parameters, need to use a parameter object, need to refactor the
* DOM parser test suite so that its a lot cleaner. * DOM parser test suite so that its a lot cleaner.
* @Deprecated
*/ */
public static IASTTranslationUnit parse(CodeReader codeReader, ILanguage language, IScannerInfo scanInfo, public static IASTTranslationUnit parse(CodeReader codeReader, ILanguage language, IScannerInfo scanInfo,
ICodeReaderFactory fileCreator, Options options) { ICodeReaderFactory fileCreator, Options options) {
@ -186,12 +190,66 @@ public class ParseHelper {
return tu; return tu;
} }
/**
* TODO thats WAY too many parameters, need to use a parameter object, need to refactor the
* DOM parser test suite so that its a lot cleaner.
*/
public static IASTTranslationUnit parse(FileContent fileContent, ILanguage language, IScannerInfo scanInfo,
IncludeFileContentProvider fileContentProvider, Options options) {
testsRun++;
public static IASTTranslationUnit commentParse(String code, ILanguage language) {
CodeReader codeReader = new CodeReader(code.toCharArray());
IASTTranslationUnit tu; IASTTranslationUnit tu;
try { try {
tu = language.getASTTranslationUnit(codeReader, new ScannerInfo(), null, null, ILanguage.OPTION_ADD_COMMENTS, ParserUtil.getParserLogService()); int languageOptions = 0;
if(options.skipTrivialInitializers)
languageOptions |= ILanguage.OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS;
tu = language.getASTTranslationUnit(fileContent, scanInfo, fileContentProvider, null, languageOptions, ParserUtil.getParserLogService());
} catch (CoreException e) {
throw new AssertionFailedError(e.toString());
}
// should parse correctly first before we look at the bindings
if(options.checkSyntaxProblems) {
// this should work for C++ also, CVisitor.getProblems() and CPPVisitor.getProblems() are exactly the same code!
if (CVisitor.getProblems(tu).length != 0) {
throw new AssertionFailedError(" CVisitor has AST Problems " );
}
}
if(options.checkPreprocessorProblems) {
if (tu.getPreprocessorProblems().length != 0) {
throw new AssertionFailedError(language.getName() + " TranslationUnit has Preprocessor Problems " );
}
}
// resolve all bindings
if (options.checkBindings) {
NameResolver res = new NameResolver();
tu.accept( res );
if(res.problemBindings.size() != options.expectedProblemBindings)
throw new AssertionFailedError("Expected " + options.expectedProblemBindings + " problem(s), encountered " + res.problemBindings.size());
if(options.problems != null) {
for(int i = 0; i < options.problems.length; i++) {
String expected = options.problems[i];
String actual = res.problemBindings.get(i);
if(!expected.equals(actual))
throw new AssertionFailedError(String.format("Problem binding not equal, expected: %s, got: %s", expected, actual));
}
}
}
return tu;
}
public static IASTTranslationUnit commentParse(String code, ILanguage language) {
IASTTranslationUnit tu;
try {
tu = language.getASTTranslationUnit(FileContent.create(AST2BaseTest.TEST_CODE, code.toCharArray()), new ScannerInfo(), null, null, ILanguage.OPTION_ADD_COMMENTS, ParserUtil.getParserLogService());
} catch (CoreException e) { } catch (CoreException e) {
throw new AssertionFailedError(e.toString()); throw new AssertionFailedError(e.toString());
} }
@ -204,9 +262,9 @@ public class ParseHelper {
public static IASTCompletionNode getCompletionNode(String code, ILanguage language, int offset) { public static IASTCompletionNode getCompletionNode(String code, ILanguage language, int offset) {
CodeReader reader = new CodeReader(code.toCharArray());
try { try {
return language.getCompletionNode(reader, new ScannerInfo(), null, null, ParserUtil.getParserLogService(), offset); return language.getCompletionNode(FileContent.create(AST2BaseTest.TEST_CODE, code.toCharArray()), new ScannerInfo(), null, null, ParserUtil.getParserLogService(), offset);
} catch (CoreException e) { } catch (CoreException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View file

@ -894,6 +894,8 @@ initializer
::= assignment_expression ::= assignment_expression
/. $Build consumeInitializer(); $EndBuild ./ /. $Build consumeInitializer(); $EndBuild ./
| initializer_list | initializer_list
--CDT_70_FIX_FROM_50-#4
/. $Build consumeInitializer(); $EndBuild ./
initializer_list initializer_list

View file

@ -1293,7 +1293,8 @@ initializer_clause
::= assignment_expression ::= assignment_expression
/. $Build consumeInitializer(); $EndBuild ./ /. $Build consumeInitializer(); $EndBuild ./
| initializer_list | initializer_list
--CDT_70_FIX_FROM_50-#4
/. $Build consumeInitializer(); $EndBuild ./
initializer_list initializer_list
::= start_initializer_list '{' <openscope-ast> initializer_seq ',' '}' end_initializer_list ::= start_initializer_list '{' <openscope-ast> initializer_seq ',' '}' end_initializer_list

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2009 IBM Corporation and others. * Copyright (c) 2006, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -35,6 +35,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement; import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement;
import org.eclipse.cdt.core.dom.ast.IASTDoStatement; import org.eclipse.cdt.core.dom.ast.IASTDoStatement;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
@ -44,7 +45,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTGotoStatement; import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.IASTInitializerList; import org.eclipse.cdt.core.dom.ast.IASTInitializerList;
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
@ -128,7 +129,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
public void initializeTranslationUnit(IScanner scanner, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index) { public void initializeTranslationUnit(IScanner scanner, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index) {
tu = nodeFactory.newTranslationUnit(); tu = nodeFactory.newTranslationUnit(scanner);
tu.setIndex(index); tu.setIndex(index);
// add built-in names to the scope // add built-in names to the scope
@ -1006,13 +1007,17 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* initializer ::= assignment_expression * initializer ::= assignment_expression
*/ */
public void consumeInitializer() { public void consumeInitializer() {
IASTExpression expr = (IASTExpression) astStack.pop(); //CDT_70_FIX_FROM_50-#4
if(discardInitializer(expr)) { IASTInitializerClause initClause = (IASTInitializerClause) astStack.pop();
astStack.push(null); if(initClause instanceof IASTExpression){
return; if(discardInitializer((IASTExpression)initClause)) {
astStack.push(null);
return;
}
} }
//CDT_70_FIX_FROM_50-#2
IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr); //IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr);
IASTEqualsInitializer initializer = nodeFactory.newEqualsInitializer(initClause);
setOffsetAndLength(initializer); setOffsetAndLength(initializer);
astStack.push(initializer); astStack.push(initializer);
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2009 IBM Corporation and others. * Copyright (c) 2006, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -28,11 +28,14 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTForStatement; import org.eclipse.cdt.core.dom.ast.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement; import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
@ -48,6 +51,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAmbiguousTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAmbiguousTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
@ -97,6 +101,7 @@ import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
@ -104,6 +109,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousDeclarator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousStatement; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConstructorInitializer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
/** /**
@ -296,9 +302,17 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeExpressionSimpleTypeConstructor() { public void consumeExpressionSimpleTypeConstructor() {
IASTExpression expression = (IASTExpression) astStack.pop(); IASTExpression expression = (IASTExpression) astStack.pop();
IToken token = (IToken) astStack.pop(); IToken token = (IToken) astStack.pop();
////CDT_70_FIX_FROM_50-#3
//int type = asICPPASTSimpleTypeConstructorExpressionType(token);
ICPPASTConstructorInitializer init=null;
if(expression!=null){
init = new CPPASTConstructorInitializer();
init.setExpression(expression);
int type = asICPPASTSimpleTypeConstructorExpressionType(token); ((ASTNode)init).setOffsetAndLength(((ASTNode)expression).getOffset(),((ASTNode)expression).getLength());
ICPPASTSimpleTypeConstructorExpression typeConstructor = nodeFactory.newSimpleTypeConstructorExpression(type, expression); }
ICPPASTDeclSpecifier declspec = transformIntoSimpleTypeSpecifier(token);
ICPPASTSimpleTypeConstructorExpression typeConstructor = nodeFactory.newSimpleTypeConstructorExpression(declspec, init);
setOffsetAndLength(typeConstructor); setOffsetAndLength(typeConstructor);
astStack.push(typeConstructor); astStack.push(typeConstructor);
@ -327,6 +341,35 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
} }
} }
private ICPPASTDeclSpecifier transformIntoSimpleTypeSpecifier(IToken token){
ICPPASTSimpleDeclSpecifier declspec= nodeFactory.newSimpleDeclSpecifier();
switch(baseKind(token)) {
case TK_char : declspec.setType(Kind.eChar); break;
case TK_wchar_t : declspec.setType(Kind.eWChar); break;
case TK_bool : declspec.setType(Kind.eBoolean);break;
case TK_short : declspec.setShort(true); break;
case TK_int : declspec.setType(Kind.eInt); break;
case TK_long : declspec.setLong(true); break;
case TK_signed : declspec.setSigned(true); break;
case TK_unsigned : declspec.setUnsigned(true); break;
case TK_float : declspec.setType(Kind.eFloat); break;
case TK_double : declspec.setType(Kind.eDouble); break;
case TK_void : declspec.setType(Kind.eVoid); break;
default:
assert false : "type parsed wrong"; //$NON-NLS-1$
declspec.setType(Kind.eUnspecified);
break;
}
((ASTNode) declspec).setOffset(token.getStartOffset());
int ruleLength = token.getEndOffset() - token.getStartOffset();
((ASTNode) declspec).setLength(ruleLength < 0 ? 0 : ruleLength);
return declspec;
}
/** /**
* postfix_expression * postfix_expression
@ -362,8 +405,9 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTExpression expr = (IASTExpression) astStack.pop(); IASTExpression expr = (IASTExpression) astStack.pop();
IASTDeclarator declarator = (IASTDeclarator) astStack.pop(); IASTDeclarator declarator = (IASTDeclarator) astStack.pop();
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop(); IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop();
//CDT_70_FIX_FROM_50-#2
IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr); //IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr);
IASTEqualsInitializer initializer = nodeFactory.newEqualsInitializer(expr);
ParserUtil.setOffsetAndLength(initializer, offset(expr), length(expr)); ParserUtil.setOffsetAndLength(initializer, offset(expr), length(expr));
declarator.setInitializer(initializer); declarator.setInitializer(initializer);
@ -1029,7 +1073,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
case TK_signed: n.setSigned(true); return; case TK_signed: n.setSigned(true); return;
case TK_unsigned: n.setUnsigned(true); return; case TK_unsigned: n.setUnsigned(true); return;
case TK_long: n.setLong(true); return; //if it is a longlong, donot set long, CDT_70_FIX_FROM_50-#8
case TK_long: if(!n.isLongLong()) n.setLong(true); return;
case TK_short: n.setShort(true); return; case TK_short: n.setShort(true); return;
} }
} }
@ -1474,8 +1519,16 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* ::= '(' expression_list ')' * ::= '(' expression_list ')'
*/ */
public void consumeInitializerConstructor() { public void consumeInitializerConstructor() {
IASTExpression expression = (IASTExpression) astStack.pop(); //CDT_70_FIX_FROM_50-#5
ICPPASTConstructorInitializer initializer = nodeFactory.newConstructorInitializer(expression); Object o = astStack.pop();
IASTInitializerClause[] initClauseList =null;
if(o instanceof IASTExpressionList){
initClauseList = ((IASTExpressionList) o).getExpressions();
}else if(o instanceof IASTInitializerClause){
initClauseList = new IASTInitializerClause[]{(IASTInitializerClause)o};
}
ICPPASTConstructorInitializer initializer = nodeFactory.newConstructorInitializer(initClauseList);
setOffsetAndLength(initializer); setOffsetAndLength(initializer);
astStack.push(initializer); astStack.push(initializer);
} }
@ -1566,8 +1619,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
List<Object> handlers = isTryBlockDeclarator ? astStack.closeScope() : Collections.emptyList(); List<Object> handlers = isTryBlockDeclarator ? astStack.closeScope() : Collections.emptyList();
IASTCompoundStatement body = (IASTCompoundStatement) astStack.pop(); IASTCompoundStatement body = (IASTCompoundStatement) astStack.pop();
List<Object> initializers = astStack.closeScope(); List<Object> initializers = astStack.closeScope();
IASTFunctionDeclarator declarator = (IASTFunctionDeclarator) astStack.pop(); Object o = astStack.pop();
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop(); // may be null IASTFunctionDeclarator declarator = (IASTFunctionDeclarator) o;
Object o2 = astStack.pop();
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) o2; // may be null
if(declSpec == null) { // can happen if implicit int is used if(declSpec == null) { // can happen if implicit int is used
declSpec = nodeFactory.newSimpleDeclSpecifier(); declSpec = nodeFactory.newSimpleDeclSpecifier();
@ -1620,12 +1675,15 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/ */
public void consumeMemberDeclaratorWithInitializer() { public void consumeMemberDeclaratorWithInitializer() {
IASTInitializerExpression initializer = (IASTInitializerExpression) astStack.pop();
//CDT_70_FIX_FROM_50-#2
//IASTInitializerExpression initializer = (IASTInitializerExpression) astStack.pop();
IASTEqualsInitializer initializer = (IASTEqualsInitializer) astStack.pop();
IASTDeclarator declarator = (IASTDeclarator) astStack.peek(); IASTDeclarator declarator = (IASTDeclarator) astStack.peek();
setOffsetAndLength(declarator); setOffsetAndLength(declarator);
if(declarator instanceof ICPPASTFunctionDeclarator) { if(declarator instanceof ICPPASTFunctionDeclarator) {
IASTExpression expr = initializer.getExpression(); IASTExpression expr = (IASTExpression)initializer.getInitializerClause();
if(expr instanceof IASTLiteralExpression && "0".equals(expr.toString())) { //$NON-NLS-1$ if(expr instanceof IASTLiteralExpression && "0".equals(expr.toString())) { //$NON-NLS-1$
((ICPPASTFunctionDeclarator)declarator).setPureVirtual(true); ((ICPPASTFunctionDeclarator)declarator).setPureVirtual(true);
return; return;

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others. * Copyright (c) 2009, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -68,8 +68,9 @@ public class GPPBuildASTParserAction extends CPPBuildASTParserAction {
// There's an expression somewhere on the stack, find it // There's an expression somewhere on the stack, find it
IASTExpression expr = findFirstAndRemove(topScope, IASTExpression.class); IASTExpression expr = findFirstAndRemove(topScope, IASTExpression.class);
IGPPASTSimpleDeclSpecifier declSpec = nodeFactory.newSimpleDeclSpecifierGPP(); //CDT_70_FIX_FROM_50-#7
declSpec.setTypeofExpression(expr); ICPPASTSimpleDeclSpecifier declSpec = nodeFactory.newSimpleDeclSpecifier();
declSpec.setDeclTypeExpression(expr);
// now apply the rest of the specifiers // now apply the rest of the specifiers
for(Object token : topScope) { for(Object token : topScope) {
@ -102,15 +103,15 @@ public class GPPBuildASTParserAction extends CPPBuildASTParserAction {
} }
} }
} }
//CDT_70_FIX_FROM_50-#7
ICPPASTSimpleDeclSpecifier declSpec; ICPPASTSimpleDeclSpecifier declSpec = nodeFactory.newSimpleDeclSpecifier();
if(isComplex || isImaginary || numLong > 1) { if(isComplex || isImaginary || numLong > 1) {
IGPPASTSimpleDeclSpecifier gppDeclSpec = nodeFactory.newSimpleDeclSpecifierGPP(); // IGPPASTSimpleDeclSpecifier gppDeclSpec = nodeFactory.newSimpleDeclSpecifierGPP();
gppDeclSpec.setComplex(isComplex); declSpec.setComplex(isComplex);
gppDeclSpec.setImaginary(isImaginary); declSpec.setImaginary(isImaginary);
gppDeclSpec.setLongLong(numLong > 1); declSpec.setLongLong(numLong > 1);
gppDeclSpec.setLong(numLong == 1); declSpec.setLong(numLong == 1);
declSpec = gppDeclSpec; //declSpec = gppDeclSpec;
} }
else { else {
declSpec = nodeFactory.newSimpleDeclSpecifier(); declSpec = nodeFactory.newSimpleDeclSpecifier();

View file

@ -1167,6 +1167,12 @@ public C99ExpressionParser(ITokenStream stream, Map<String,String> properties) {
case 282: { action. consumeInitializer(); break; case 282: { action. consumeInitializer(); break;
} }
//
// Rule 283: initializer ::= initializer_list
//
case 283: { action. consumeInitializer(); break;
}
// //
// Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1161,6 +1161,12 @@ public C99NoCastExpressionParser(ITokenStream stream, Map<String,String> propert
case 281: { action. consumeInitializer(); break; case 281: { action. consumeInitializer(); break;
} }
//
// Rule 282: initializer ::= initializer_list
//
case 282: { action. consumeInitializer(); break;
}
// //
// Rule 283: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 283: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1144,6 +1144,12 @@ public String getName() {
case 282: { action. consumeInitializer(); break; case 282: { action. consumeInitializer(); break;
} }
//
// Rule 283: initializer ::= initializer_list
//
case 283: { action. consumeInitializer(); break;
}
// //
// Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1161,6 +1161,12 @@ public C99SizeofExpressionParser(ITokenStream stream, Map<String,String> propert
case 281: { action. consumeInitializer(); break; case 281: { action. consumeInitializer(); break;
} }
//
// Rule 282: initializer ::= initializer_list
//
case 282: { action. consumeInitializer(); break;
}
// //
// Rule 283: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 283: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1564,6 +1564,12 @@ public CPPExpressionParser(ITokenStream stream, Map<String,String> properties) {
case 382: { action. consumeInitializer(); break; case 382: { action. consumeInitializer(); break;
} }
//
// Rule 383: initializer_clause ::= initializer_list
//
case 383: { action. consumeInitializer(); break;
}
// //
// Rule 384: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 384: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1558,6 +1558,12 @@ public CPPNoCastExpressionParser(ITokenStream stream, Map<String,String> propert
case 381: { action. consumeInitializer(); break; case 381: { action. consumeInitializer(); break;
} }
//
// Rule 382: initializer_clause ::= initializer_list
//
case 382: { action. consumeInitializer(); break;
}
// //
// Rule 383: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 383: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1558,6 +1558,12 @@ public CPPNoFunctionDeclaratorParser(ITokenStream stream, Map<String,String> pro
case 380: { action. consumeInitializer(); break; case 380: { action. consumeInitializer(); break;
} }
//
// Rule 381: initializer_clause ::= initializer_list
//
case 381: { action. consumeInitializer(); break;
}
// //
// Rule 382: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 382: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1541,6 +1541,12 @@ public String getName() {
case 382: { action. consumeInitializer(); break; case 382: { action. consumeInitializer(); break;
} }
//
// Rule 383: initializer_clause ::= initializer_list
//
case 383: { action. consumeInitializer(); break;
}
// //
// Rule 384: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 384: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1552,6 +1552,12 @@ public CPPSizeofExpressionParser(ITokenStream stream, Map<String,String> propert
case 380: { action. consumeInitializer(); break; case 380: { action. consumeInitializer(); break;
} }
//
// Rule 381: initializer_clause ::= initializer_list
//
case 381: { action. consumeInitializer(); break;
}
// //
// Rule 382: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 382: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1566,6 +1566,12 @@ public CPPTemplateTypeParameterParser(ITokenStream stream, Map<String,String> pr
case 382: { action. consumeInitializer(); break; case 382: { action. consumeInitializer(); break;
} }
//
// Rule 383: initializer_clause ::= initializer_list
//
case 383: { action. consumeInitializer(); break;
}
// //
// Rule 384: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 384: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1155,6 +1155,12 @@ private GNUBuildASTParserAction gnuAction;
case 282: { action. consumeInitializer(); break; case 282: { action. consumeInitializer(); break;
} }
//
// Rule 283: initializer ::= initializer_list
//
case 283: { action. consumeInitializer(); break;
}
// //
// Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1172,6 +1172,12 @@ private GNUBuildASTParserAction gnuAction;
case 281: { action. consumeInitializer(); break; case 281: { action. consumeInitializer(); break;
} }
//
// Rule 282: initializer ::= initializer_list
//
case 282: { action. consumeInitializer(); break;
}
// //
// Rule 283: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 283: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1547,6 +1547,12 @@ private GNUBuildASTParserAction gnuAction;
case 381: { action. consumeInitializer(); break; case 381: { action. consumeInitializer(); break;
} }
//
// Rule 382: initializer_clause ::= initializer_list
//
case 382: { action. consumeInitializer(); break;
}
// //
// Rule 383: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 383: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -1558,6 +1558,12 @@ private GNUBuildASTParserAction gnuAction;
case 379: { action. consumeInitializer(); break; case 379: { action. consumeInitializer(); break;
} }
//
// Rule 380: initializer_clause ::= initializer_list
//
case 380: { action. consumeInitializer(); break;
}
// //
// Rule 381: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 381: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //

View file

@ -275,28 +275,6 @@ public class XlcExtensionsTest extends XlcTestBase {
parse(code, getCPPLanguage(), true); // xlc supports this in C++ parse(code, getCPPLanguage(), true); // xlc supports this in C++
} }
public void testStaticAssertions() {
String code =
" const unsigned int EIGHT= 8; \n"+
" __static_assert(sizeof(long) >= EIGHT, \"no 64-bit support\"); \n" +
" namespace ns { \n"+
" __static_assert(sizeof(long) >= 4, \"no 32-bit support\"); \n" +
" } \n" +
" template <typename T> class basic_string { \n" +
" __static_assert(T::value, \"bla\"); \n" +
" }; \n" +
" void do_something() { \n" +
" struct VMPage { \n" +
" }; \n" +
" __static_assert(sizeof(VMPage) == 1, \"bla\"); \n" +
" }";
parse(code, getCPPLanguage(), true); // xlc supports this in C++
}
public void testV11Attributes() { public void testV11Attributes() {
String code = String code =
"#define __inline__ __inline__ __attribute__((gnu_inline)) \n" + "#define __inline__ __inline__ __attribute__((gnu_inline)) \n" +

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others. * Copyright (c) 2009, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -16,11 +16,18 @@ import org.eclipse.cdt.core.lrparser.tests.LRCPPTests;
import org.eclipse.cdt.core.lrparser.xlc.XlcCLanguage; import org.eclipse.cdt.core.lrparser.xlc.XlcCLanguage;
import org.eclipse.cdt.core.lrparser.xlc.XlcCPPLanguage; import org.eclipse.cdt.core.lrparser.xlc.XlcCPPLanguage;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.ParserLanguage;
public class XlcLRCPPTests extends LRCPPTests { public class XlcLRCPPTests extends LRCPPTests {
public static TestSuite suite() { public static TestSuite suite() {
return suite(XlcLRCPPTests.class); return suite(XlcLRCPPTests.class);
} }
//CDT_70_FIX_FROM_50-#9
public void testStaticAssertions_294730() throws Exception {
String code= getAboveComment();
code = code.replaceAll("static_assert", "__static_assert");
parseAndCheckBindings(code, ParserLanguage.CPP);
}
protected ILanguage getCLanguage() { protected ILanguage getCLanguage() {
return XlcCLanguage.getDefault(); return XlcCLanguage.getDefault();

View file

@ -1159,6 +1159,12 @@ private GNUBuildASTParserAction gnuAction;
case 282: { action. consumeInitializer(); break; case 282: { action. consumeInitializer(); break;
} }
//
// Rule 283: initializer ::= initializer_list
//
case 283: { action. consumeInitializer(); break;
}
// //
// Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list // Rule 284: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq comma_opt } end_initializer_list
// //

View file

@ -1551,6 +1551,12 @@ private GNUBuildASTParserAction gnuAction;
case 381: { action. consumeInitializer(); break; case 381: { action. consumeInitializer(); break;
} }
//
// Rule 382: initializer_clause ::= initializer_list
//
case 382: { action. consumeInitializer(); break;
}
// //
// Rule 383: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list // Rule 383: initializer_list ::= start_initializer_list { <openscope-ast> initializer_seq , } end_initializer_list
// //