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);
}
}
// 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.IASTIfStatement;
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.IASTNamedTypeSpecifier;
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.IASTWhileStatement;
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.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.ISourceCodeParser;
@ -1161,10 +1163,28 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected abstract IASTConditionalExpression createConditionalExpression();
protected IASTExpression buildUnaryExpression(int operator,
IASTExpression operand, int offset, int lastOffset) {
protected IASTExpression unarayExpression(int operator) throws EndOfFileException, BacktrackException {
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();
((ASTNode) result).setOffsetAndLength(offset, lastOffset - offset);
setRange(result, offset, lastOffset);
result.setOperator(operator);
result.setOperand(operand);
return result;

View file

@ -597,21 +597,21 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
BacktrackException {
switch (LT(1)) {
case IToken.tSTAR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_star);
return unarayExpression(IASTUnaryExpression.op_star);
case IToken.tAMPER:
return unaryOperatorCastExpression(IASTUnaryExpression.op_amper);
return unarayExpression(IASTUnaryExpression.op_amper);
case IToken.tPLUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_plus);
return unarayExpression(IASTUnaryExpression.op_plus);
case IToken.tMINUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_minus);
return unarayExpression(IASTUnaryExpression.op_minus);
case IToken.tNOT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_not);
return unarayExpression(IASTUnaryExpression.op_not);
case IToken.tBITCOMPLEMENT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_tilde);
return unarayExpression(IASTUnaryExpression.op_tilde);
case IToken.tINCR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixIncr);
return unarayExpression(IASTUnaryExpression.op_prefixIncr);
case IToken.tDECR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr);
return unarayExpression(IASTUnaryExpression.op_prefixDecr);
case IToken.t_sizeof:
return parseTypeidInParenthesisOrUnaryExpression(false, consume().getOffset(),
IASTTypeIdExpression.op_sizeof, IASTUnaryExpression.op_sizeof);
@ -2399,22 +2399,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
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 {
int startOffset;

View file

@ -1070,21 +1070,21 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
protected IASTExpression unaryExpression() throws EndOfFileException, BacktrackException {
switch (LT(1)) {
case IToken.tSTAR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_star);
return unarayExpression(IASTUnaryExpression.op_star);
case IToken.tAMPER:
return unaryOperatorCastExpression(IASTUnaryExpression.op_amper);
return unarayExpression(IASTUnaryExpression.op_amper);
case IToken.tPLUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_plus);
return unarayExpression(IASTUnaryExpression.op_plus);
case IToken.tMINUS:
return unaryOperatorCastExpression(IASTUnaryExpression.op_minus);
return unarayExpression(IASTUnaryExpression.op_minus);
case IToken.tNOT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_not);
return unarayExpression(IASTUnaryExpression.op_not);
case IToken.tBITCOMPLEMENT:
return unaryOperatorCastExpression(IASTUnaryExpression.op_tilde);
return unarayExpression(IASTUnaryExpression.op_tilde);
case IToken.tINCR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixIncr);
return unarayExpression(IASTUnaryExpression.op_prefixIncr);
case IToken.tDECR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr);
return unarayExpression(IASTUnaryExpression.op_prefixDecr);
case IToken.t_new:
return newExpression();
case IToken.t_delete:
@ -4512,25 +4512,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
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 {
int startOffset;
startOffset = consume().getOffset();