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:
parent
e6644046f6
commit
099c3c1f96
4 changed files with 49 additions and 54 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue