1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Partial fix for cast-ambiguity, bug 211756.

This commit is contained in:
Markus Schorn 2008-02-13 15:07:23 +00:00
parent ea7f5375cd
commit 495735b5e3
2 changed files with 122 additions and 66 deletions

View file

@ -5687,4 +5687,25 @@ public class AST2CPPTests extends AST2BaseTest {
IBinding b= bh.assertNonProblem("a=", 1);
assertEquals("x", b.getScope().getScopeName().toString());
}
// class Test {
// public:
// Test(int, int *) {}
// Test(int *) {}
// };
// void test () {
// int bar= 0;
// int * pBar = &bar;
// Test foo1 (bar, &bar);
// Test foo2 (bar, pBar);
// Test foo3 (&bar);
// }
public void testCastAmbiguity_Bug211756() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getContents(1)[0].toString(), true);
bh.assertNonProblem("foo1", 4);
bh.assertNonProblem("foo2", 4);
bh.assertNonProblem("foo3", 4);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2007 IBM Corporation and others.
* Copyright (c) 2002, 2008 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
@ -666,6 +666,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @param expression
* @throws BacktrackException
*/
@Override
protected IASTExpression assignmentExpression() throws EndOfFileException,
BacktrackException {
if (LT(1) == IToken.t_throw) {
@ -751,6 +752,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @param expression
* @throws BacktrackException
*/
@Override
protected IASTExpression relationalExpression() throws BacktrackException, EndOfFileException {
IASTExpression firstExpression = shiftExpression();
@ -823,6 +825,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @param expression
* @throws BacktrackException
*/
@Override
protected IASTExpression multiplicativeExpression() throws BacktrackException, EndOfFileException {
IASTExpression firstExpression = pmExpression();
for (;;) {
@ -889,6 +892,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
/**
* castExpression : unaryExpression | "(" typeId ")" castExpression
*/
@Override
protected IASTExpression castExpression() throws EndOfFileException, BacktrackException {
// TO DO: we need proper symbol checkint to ensure type name
if (LT(1) == IToken.tLPAREN) {
@ -946,6 +950,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
/**
* @throws BacktrackException
*/
@Override
protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException {
if (!canBeTypeSpecifier()) {
return null;
@ -1310,6 +1315,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @param expression
* @throws BacktrackException
*/
@Override
protected IASTExpression unaryExpression() throws EndOfFileException,
BacktrackException {
switch (LT(1)) {
@ -1616,6 +1622,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
}
@Override
protected IASTAmbiguousExpression createAmbiguousExpression() {
return new CPPASTAmbiguousExpression();
}
@ -1773,6 +1780,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
/**
* @return
*/
@Override
protected IASTIdExpression createIdExpression() {
return new CPPASTIdExpression();
}
@ -2307,6 +2315,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @throws BacktrackException
* request a backtrack
*/
@Override
protected IASTDeclaration declaration() throws EndOfFileException, BacktrackException {
switch (LT(1)) {
case IToken.t_asm:
@ -2366,23 +2375,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
if (sd.getDeclarators()[0] instanceof IASTStandardFunctionDeclarator) {
IASTStandardFunctionDeclarator fd = (IASTStandardFunctionDeclarator) sd.getDeclarators()[0];
if (sd.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef)
return d1;
IASTParameterDeclaration[] parms = fd.getParameters();
for (int i = 0; i < parms.length; ++i) {
if (!(parms[i].getDeclSpecifier() instanceof IASTNamedTypeSpecifier))
return d1;
IASTDeclarator d = parms[i].getDeclarator();
if (d == null) // must be an EOC
return d1;
if (((ASTNode)d.getName()).getLength() > 0)
return d1;
while (d.getNestedDeclarator() != null)
d = d.getNestedDeclarator();
if (((ASTNode) d.getName()).getLength() > 0)
return d1;
}
} else
return d1;
}
@ -2831,6 +2825,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
@Override
protected IASTSimpleDeclaration createSimpleDeclaration() {
return new CPPASTSimpleDeclaration();
}
@ -3349,6 +3344,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
@Override
protected IASTNamedTypeSpecifier createNamedTypeSpecifier() {
return new CPPASTNamedTypeSpecifier();
}
@ -3400,6 +3396,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return new CPPASTElaboratedTypeSpecifier();
}
@Override
protected IASTDeclarator initDeclarator() throws EndOfFileException, BacktrackException {
return initDeclarator(SimpleDeclarationStrategy.TRY_FUNCTION);
}
@ -4277,6 +4274,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* This is the top-level entry point into the ANSI C++ grammar.
* translationUnit : (declaration)*
*/
@Override
protected void translationUnit() {
try {
translationUnit = createTranslationUnit();
@ -4384,34 +4382,42 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return new CPPASTArrayModifier();
}
@Override
protected IASTTranslationUnit getTranslationUnit() {
return translationUnit;
}
@Override
protected IASTCompoundStatement createCompoundStatement() {
return new CPPASTCompoundStatement();
}
@Override
protected IASTBinaryExpression createBinaryExpression() {
return new CPPASTBinaryExpression();
}
@Override
protected IASTConditionalExpression createConditionalExpression() {
return new CPPASTConditionalExpression();
}
@Override
protected IASTUnaryExpression createUnaryExpression() {
return new CPPASTUnaryExpression();
}
@Override
protected IGNUASTCompoundStatementExpression createCompoundStatementExpression() {
return new CPPASTCompoundStatementExpression();
}
@Override
protected IASTExpressionList createExpressionList() {
return new CPPASTExpressionList();
}
@Override
protected IASTName createName(IToken token) {
IASTName n = null;
@ -4432,15 +4438,18 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return n;
}
@Override
protected IASTName createName() {
return new CPPASTName();
}
@Override
protected IASTEnumerator createEnumerator() {
return new CPPASTEnumerator();
}
@Override
protected IASTExpression buildTypeIdExpression(int op, IASTTypeId typeId,
int startingOffset, int endingOffset) {
ICPPASTTypeIdExpression typeIdExpression = createTypeIdExpression();
@ -4455,18 +4464,22 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return new CPPASTTypeIdExpression();
}
@Override
protected IASTEnumerationSpecifier createEnumerationSpecifier() {
return new CPPASTEnumerationSpecifier();
}
@Override
protected IASTLabelStatement createLabelStatement() {
return new CPPASTLabelStatement();
}
@Override
protected IASTGotoStatement createGoToStatement() {
return new CPPASTGotoStatement();
}
@Override
protected IASTReturnStatement createReturnStatement() {
return new CPPASTReturnStatement();
}
@ -4475,22 +4488,27 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return new CPPASTForStatement();
}
@Override
protected IASTContinueStatement createContinueStatement() {
return new CPPASTContinueStatement();
}
@Override
protected IASTDoStatement createDoStatement() {
return new CPPASTDoStatement();
}
@Override
protected IASTBreakStatement createBreakStatement() {
return new CPPASTBreakStatement();
}
@Override
protected IASTWhileStatement createWhileStatement() {
return new CPPASTWhileStatement();
}
@Override
protected IASTNullStatement createNullStatement() {
return new CPPASTNullStatement();
}
@ -4503,30 +4521,37 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return new CPPASTIfStatement();
}
@Override
protected IASTDefaultStatement createDefaultStatement() {
return new CPPASTDefaultStatement();
}
@Override
protected IASTCaseStatement createCaseStatement() {
return new CPPASTCaseStatement();
}
@Override
protected IASTExpressionStatement createExpressionStatement() {
return new CPPASTExpressionStatement();
}
@Override
protected IASTDeclarationStatement createDeclarationStatement() {
return new CPPASTDeclarationStatement();
}
@Override
protected IASTASMDeclaration createASMDirective() {
return new CPPASTASMDeclaration();
}
@Override
protected IASTCastExpression createCastExpression() {
return new CPPASTCastExpression();
}
@Override
protected IASTStatement statement() throws EndOfFileException,
BacktrackException {
@ -4602,18 +4627,22 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return new CPPASTTryBlockStatement();
}
@Override
protected void nullifyTranslationUnit() {
translationUnit = null;
}
@Override
protected IASTProblemStatement createProblemStatement() {
return new CPPASTProblemStatement();
}
@Override
protected IASTProblemExpression createProblemExpression() {
return new CPPASTProblemExpression();
}
@Override
protected IASTProblem createProblem(int signal, int offset, int length) {
IASTProblem result = new CPPASTProblem(signal, EMPTY_STRING, false, true);
((ASTNode) result).setOffsetAndLength(offset, length);
@ -4622,6 +4651,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
@Override
protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException {
int startOffset = consume().getOffset();
consume(IToken.tLPAREN);
@ -4696,10 +4726,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
private int functionBodyCount;
@Override
protected ASTVisitor createVisitor() {
return EMPTY_VISITOR;
}
@Override
protected IASTAmbiguousStatement createAmbiguousStatement() {
return new CPPASTAmbiguousStatement();
}
@ -4815,6 +4847,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return result;
}
@Override
protected void checkTokenVsDeclarator(IToken la, IASTDeclarator d) throws FoundDeclaratorException {
switch (la.getType()) {
case IToken.tCOLON:
@ -4825,6 +4858,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
}
@Override
protected IASTStatement functionBody() throws EndOfFileException, BacktrackException {
++functionBodyCount;
IASTStatement s = super.functionBody();
@ -4832,6 +4866,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return s;
}
@Override
protected IASTDeclaration simpleDeclaration() throws BacktrackException, EndOfFileException {
return simpleDeclarationStrategyUnion();
}