diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 7779472e4e1..2097ebe6e34 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -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); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index ce190e833cf..6fa6a293e96 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -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; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 5dcf22cd4cd..e3acba036f7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -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; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 999d5659e1e..d324affbcae 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -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();