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

Allow address of operator on literals, bug 252970.

This commit is contained in:
Markus Schorn 2008-11-03 10:12:16 +00:00
parent e6644046f6
commit 099c3c1f96
4 changed files with 49 additions and 54 deletions

View file

@ -5490,4 +5490,14 @@ public class AST2Tests extends AST2BaseTest {
assertEquals(2, tu.getReferences(name.resolveBinding()).length); assertEquals(2, tu.getReferences(name.resolveBinding()).length);
} }
} }
// void test() {
// const void* p = &"string";
// }
public void testAdressOfStringLiteral_Bug252970() throws Exception {
final String code = getAboveComment();
for (ParserLanguage lang : ParserLanguage.values()) {
parseAndCheckBindings(code, lang);
}
}
} }

View file

@ -44,6 +44,7 @@ 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.IASTIfStatement; import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
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.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
@ -62,6 +63,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
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.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.core.dom.parser.ISourceCodeParser;
@ -1161,10 +1163,28 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected abstract IASTConditionalExpression createConditionalExpression(); protected abstract IASTConditionalExpression createConditionalExpression();
protected IASTExpression buildUnaryExpression(int operator, protected IASTExpression unarayExpression(int operator) throws EndOfFileException, BacktrackException {
IASTExpression operand, int offset, int lastOffset) { final IToken operatorToken= consume();
final IASTExpression operand= castExpression();
if (operator == IASTUnaryExpression.op_star && operand instanceof IASTLiteralExpression) {
IASTLiteralExpression lit= (IASTLiteralExpression) operand;
switch(lit.getKind()) {
case IASTLiteralExpression.lk_char_constant:
case IASTLiteralExpression.lk_float_constant:
case IASTLiteralExpression.lk_integer_constant:
case ICPPASTLiteralExpression.lk_true:
case ICPPASTLiteralExpression.lk_false:
throwBacktrack(operatorToken);
}
}
return buildUnaryExpression(operator, operand, operatorToken.getOffset(), calculateEndOffset(operand));
}
protected IASTExpression buildUnaryExpression(int operator, IASTExpression operand, int offset, int lastOffset) {
IASTUnaryExpression result = createUnaryExpression(); IASTUnaryExpression result = createUnaryExpression();
((ASTNode) result).setOffsetAndLength(offset, lastOffset - offset); setRange(result, offset, lastOffset);
result.setOperator(operator); result.setOperator(operator);
result.setOperand(operand); result.setOperand(operand);
return result; return result;

View file

@ -597,21 +597,21 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
BacktrackException { BacktrackException {
switch (LT(1)) { switch (LT(1)) {
case IToken.tSTAR: case IToken.tSTAR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_star); return unarayExpression(IASTUnaryExpression.op_star);
case IToken.tAMPER: case IToken.tAMPER:
return unaryOperatorCastExpression(IASTUnaryExpression.op_amper); return unarayExpression(IASTUnaryExpression.op_amper);
case IToken.tPLUS: case IToken.tPLUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_plus); return unarayExpression(IASTUnaryExpression.op_plus);
case IToken.tMINUS: case IToken.tMINUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_minus); return unarayExpression(IASTUnaryExpression.op_minus);
case IToken.tNOT: case IToken.tNOT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_not); return unarayExpression(IASTUnaryExpression.op_not);
case IToken.tBITCOMPLEMENT: case IToken.tBITCOMPLEMENT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_tilde); return unarayExpression(IASTUnaryExpression.op_tilde);
case IToken.tINCR: case IToken.tINCR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixIncr); return unarayExpression(IASTUnaryExpression.op_prefixIncr);
case IToken.tDECR: case IToken.tDECR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr); return unarayExpression(IASTUnaryExpression.op_prefixDecr);
case IToken.t_sizeof: case IToken.t_sizeof:
return parseTypeidInParenthesisOrUnaryExpression(false, consume().getOffset(), return parseTypeidInParenthesisOrUnaryExpression(false, consume().getOffset(),
IASTTypeIdExpression.op_sizeof, IASTUnaryExpression.op_sizeof); IASTTypeIdExpression.op_sizeof, IASTUnaryExpression.op_sizeof);
@ -2399,22 +2399,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return result; return result;
} }
protected IASTExpression unaryOperatorCastExpression(int operator) throws EndOfFileException, BacktrackException {
IToken mark = mark();
int offset = consume().getOffset();
IASTExpression castExpression = castExpression();
if( castExpression instanceof IASTLiteralExpression ) {
IASTLiteralExpression lit= (IASTLiteralExpression) castExpression;
if ( operator == IASTUnaryExpression.op_amper ||
(operator == IASTUnaryExpression.op_star && lit.getKind() != IASTLiteralExpression.lk_string_literal) )
{
backup( mark );
throwBacktrack( mark );
}
}
return buildUnaryExpression(operator, castExpression, offset,
calculateEndOffset(castExpression));
}
protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException { protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
int startOffset; int startOffset;

View file

@ -1070,21 +1070,21 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
protected IASTExpression unaryExpression() throws EndOfFileException, BacktrackException { protected IASTExpression unaryExpression() throws EndOfFileException, BacktrackException {
switch (LT(1)) { switch (LT(1)) {
case IToken.tSTAR: case IToken.tSTAR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_star); return unarayExpression(IASTUnaryExpression.op_star);
case IToken.tAMPER: case IToken.tAMPER:
return unaryOperatorCastExpression(IASTUnaryExpression.op_amper); return unarayExpression(IASTUnaryExpression.op_amper);
case IToken.tPLUS: case IToken.tPLUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_plus); return unarayExpression(IASTUnaryExpression.op_plus);
case IToken.tMINUS: case IToken.tMINUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_minus); return unarayExpression(IASTUnaryExpression.op_minus);
case IToken.tNOT: case IToken.tNOT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_not); return unarayExpression(IASTUnaryExpression.op_not);
case IToken.tBITCOMPLEMENT: case IToken.tBITCOMPLEMENT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_tilde); return unarayExpression(IASTUnaryExpression.op_tilde);
case IToken.tINCR: case IToken.tINCR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixIncr); return unarayExpression(IASTUnaryExpression.op_prefixIncr);
case IToken.tDECR: case IToken.tDECR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr); return unarayExpression(IASTUnaryExpression.op_prefixDecr);
case IToken.t_new: case IToken.t_new:
return newExpression(); return newExpression();
case IToken.t_delete: case IToken.t_delete:
@ -4512,25 +4512,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return s; return s;
} }
protected IASTExpression unaryOperatorCastExpression(int operator) throws EndOfFileException, BacktrackException {
IToken mark = mark();
int offset = consume().getOffset();
IASTExpression castExpression = castExpression();
if (castExpression instanceof IASTLiteralExpression) {
IASTLiteralExpression literal = (IASTLiteralExpression) castExpression;
if( literal.getKind() != ICPPASTLiteralExpression.lk_this ) {
if ( operator == IASTUnaryExpression.op_amper ||
(operator == IASTUnaryExpression.op_star &&
literal.getKind() != IASTLiteralExpression.lk_string_literal) ) {
backup( mark );
throwBacktrack( mark );
}
}
}
return buildUnaryExpression(operator, castExpression, offset,
calculateEndOffset(castExpression));
}
protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException { protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
int startOffset; int startOffset;
startOffset = consume().getOffset(); startOffset = consume().getOffset();