1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-13 11:15:38 +02:00

Bug 527844: ExpressionWriter does not write IASTLiteralExpression suffix

Change-Id: I4dbca527a16c698d7f1a16f2a6a0eca2e6cdc77a
Signed-off-by: Hansruedi Patzen <hansruedi.patzen@hsr.ch>
This commit is contained in:
Hansruedi Patzen 2017-11-28 15:48:19 +01:00 committed by Sergey Prigogin
parent 86c3d8eeca
commit 3e66e22aed
8 changed files with 464 additions and 341 deletions

View file

@ -12025,6 +12025,39 @@ public class AST2CPPTests extends AST2CPPTestBase {
assertEquals(IProblem.PREPROCESSOR_MULTIPLE_USER_DEFINED_SUFFIXES_IN_CONCATENATION, problems[0].getID()); assertEquals(IProblem.PREPROCESSOR_MULTIPLE_USER_DEFINED_SUFFIXES_IN_CONCATENATION, problems[0].getID());
} }
// struct basic_string {
// basic_string(char const * str, int len);
// };
// basic_string operator""s(char const * str, int len) {
// return basic_string { str, len };
// }
// auto waldo = "Waldo"s;
public void testStringLiterals() throws Exception {
checkUserDefinedLiteralIsType(getAboveComment(), "basic_string");
}
// auto waldo = 1i + 1;
public void testComplexNumbersCompilerSupport1() throws Exception {
checkUserDefinedLiteralIsType(getAboveComment(), "_Complex int");
}
// auto waldo = 1j + 1;
public void testComplexNumbersCompilerSupport2() throws Exception {
checkUserDefinedLiteralIsType(getAboveComment(), "_Complex int");
}
// struct complex {
// complex(unsigned long long real, unsigned long long imag);
// complex operator+(unsigned long long);
// };
// complex operator""i(unsigned long long imag) {
// return complex { 0, imag };
// }
// auto waldo = 1i + 1;
public void testComplexNumbersOverriddenCompilerSupport() throws Exception {
checkUserDefinedLiteralIsType(getAboveComment(), "complex");
}
// // Test name lacking a space // // Test name lacking a space
// int operator ""X(const char* s) { return 0; } // int operator ""X(const char* s) { return 0; }
// int operator ""_X(const char* s) { return 0; } // int operator ""_X(const char* s) { return 0; }

View file

@ -198,3 +198,22 @@ TestClass* tc = new TestClass();
//%CPP //%CPP
int i = int(1); int i = int(1);
//!CPP LiteralExpression with string literal
//%CPP
int main()
{
using namespace std::string_literals;
auto str = "foobar"s;
}
//!CPP LiteralExpression with user defined literal
//%CPP
constexpr long double operator ""_deg(long double deg)
{
return deg * 3.141592 / 180;
}
int main()
{
double x = 90.0_deg;
}

View file

@ -223,6 +223,11 @@ public interface ICPPNodeFactory extends INodeFactory {
@Override @Override
public ICPPASTLiteralExpression newLiteralExpression(int kind, String rep); public ICPPASTLiteralExpression newLiteralExpression(int kind, String rep);
/**
* @since 6.5
*/
public ICPPASTLiteralExpression newLiteralExpression(int kind, String rep, char[] numericCompilerSuffixes);
public ICPPASTNamespaceAlias newNamespaceAlias(IASTName alias, IASTName qualifiedName); public ICPPASTNamespaceAlias newNamespaceAlias(IASTName alias, IASTName qualifiedName);
public ICPPASTNamespaceDefinition newNamespaceDefinition(IASTName name); public ICPPASTNamespaceDefinition newNamespaceDefinition(IASTName name);

View file

@ -175,9 +175,9 @@ public class CharArrayUtils {
} }
public static final char[] concat(char[] first, char[] second) { public static final char[] concat(char[] first, char[] second) {
if (first == null) if (first == null || first.length == 0)
return second; return second;
if (second == null) if (second == null || second.length == 0)
return first; return first;
int length1 = first.length; int length1 = first.length;

View file

@ -549,6 +549,11 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory {
return new CPPASTLiteralExpression(kind, rep.toCharArray()); return new CPPASTLiteralExpression(kind, rep.toCharArray());
} }
@Override
public ICPPASTLiteralExpression newLiteralExpression(int kind, String rep, char[] numericCompilerSuffixes) {
return new CPPASTLiteralExpression(kind, rep.toCharArray(), numericCompilerSuffixes);
}
@Override @Override
public ICPPASTName newName() { public ICPPASTName newName() {
return new CPPASTName(); return new CPPASTName();

View file

@ -1931,15 +1931,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.tINTEGER: case IToken.tINTEGER:
t = consume(); t = consume();
literalExpr = getNodeFactory().newLiteralExpression(IASTLiteralExpression.lk_integer_constant, t.getImage()); literalExpr = getNodeFactory().newLiteralExpression(IASTLiteralExpression.lk_integer_constant, t.getImage(), additionalNumericalSuffixes);
literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset()); literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset());
((CPPASTLiteralExpression) literalExpr).calculateSuffix(additionalNumericalSuffixes);
break; break;
case IToken.tFLOATINGPT: case IToken.tFLOATINGPT:
t = consume(); t = consume();
literalExpr = getNodeFactory().newLiteralExpression(IASTLiteralExpression.lk_float_constant, t.getImage()); literalExpr = getNodeFactory().newLiteralExpression(IASTLiteralExpression.lk_float_constant, t.getImage(), additionalNumericalSuffixes);
literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset()); literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset());
((CPPASTLiteralExpression) literalExpr).calculateSuffix(additionalNumericalSuffixes);
break; break;
case IToken.tSTRING: case IToken.tSTRING:
case IToken.tLSTRING: case IToken.tLSTRING:
@ -1947,9 +1945,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
case IToken.tUTF32STRING: case IToken.tUTF32STRING:
case IToken.tUSER_DEFINED_STRING_LITERAL: case IToken.tUSER_DEFINED_STRING_LITERAL:
literalExprWithRange = stringLiteral(); literalExprWithRange = stringLiteral();
if (supportUserDefinedLiterals) {
((CPPASTLiteralExpression) literalExprWithRange).calculateSuffix();
}
break; break;
case IToken.tCHAR: case IToken.tCHAR:
case IToken.tLCHAR: case IToken.tLCHAR:
@ -1960,9 +1955,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
literalExpr = getNodeFactory().newLiteralExpression( literalExpr = getNodeFactory().newLiteralExpression(
IASTLiteralExpression.lk_char_constant, t.getImage()); IASTLiteralExpression.lk_char_constant, t.getImage());
literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset()); literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset());
if (supportUserDefinedLiterals) {
((CPPASTLiteralExpression) literalExprWithRange).calculateSuffix();
}
break; break;
case IToken.t_false: case IToken.t_false:
t = consume(); t = consume();
@ -2031,7 +2023,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return literalExprWithRange; return literalExprWithRange;
} }
IToken opName = consume(IToken.tIDENTIFIER); IToken opName = consume(IToken.tIDENTIFIER);
((CPPASTLiteralExpression) literalExprWithRange).addSuffix(opName.getCharImage()); ((CPPASTLiteralExpression) literalExprWithRange).setSuffix(opName.getCharImage());
setRange(literalExprWithRange, offset, opName.getEndOffset()); setRange(literalExprWithRange, offset, opName.getEndOffset());
} }
} }

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression;
import org.eclipse.cdt.core.dom.rewrite.TypeHelper; import org.eclipse.cdt.core.dom.rewrite.TypeHelper;
import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.core.parser.Keywords;
@ -220,8 +221,7 @@ public abstract class AccessorFactory {
CPPASTName parameterName = getSetterParameterName(); CPPASTName parameterName = getSetterParameterName();
if (Arrays.equals(fieldName.getSimpleID(), parameterName.getSimpleID())) { if (Arrays.equals(fieldName.getSimpleID(), parameterName.getSimpleID())) {
CPPASTFieldReference fieldRef = new CPPASTFieldReference(); CPPASTFieldReference fieldRef = new CPPASTFieldReference();
CPPASTLiteralExpression litExpr = new CPPASTLiteralExpression(); CPPASTLiteralExpression litExpr = new CPPASTLiteralExpression(ICPPASTLiteralExpression.lk_this, Keywords.cTHIS);
litExpr.setValue(Keywords.cTHIS);
fieldRef.setFieldOwner(litExpr); fieldRef.setFieldOwner(litExpr);
fieldRef.setIsPointerDereference(true); fieldRef.setIsPointerDereference(true);
fieldRef.setFieldName(fieldName.copy(CopyStyle.withLocations)); fieldRef.setFieldName(fieldName.copy(CopyStyle.withLocations));