1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +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());
}
// 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
// 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
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
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 ICPPASTNamespaceDefinition newNamespaceDefinition(IASTName name);

View file

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

View file

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

View file

@ -1931,15 +1931,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) {
case IToken.tINTEGER:
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());
((CPPASTLiteralExpression) literalExpr).calculateSuffix(additionalNumericalSuffixes);
break;
case IToken.tFLOATINGPT:
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());
((CPPASTLiteralExpression) literalExpr).calculateSuffix(additionalNumericalSuffixes);
break;
case IToken.tSTRING:
case IToken.tLSTRING:
@ -1947,9 +1945,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
case IToken.tUTF32STRING:
case IToken.tUSER_DEFINED_STRING_LITERAL:
literalExprWithRange = stringLiteral();
if (supportUserDefinedLiterals) {
((CPPASTLiteralExpression) literalExprWithRange).calculateSuffix();
}
break;
case IToken.tCHAR:
case IToken.tLCHAR:
@ -1960,9 +1955,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
literalExpr = getNodeFactory().newLiteralExpression(
IASTLiteralExpression.lk_char_constant, t.getImage());
literalExprWithRange = setRange(literalExpr, t.getOffset(), t.getEndOffset());
if (supportUserDefinedLiterals) {
((CPPASTLiteralExpression) literalExprWithRange).calculateSuffix();
}
break;
case IToken.t_false:
t = consume();
@ -2031,7 +2023,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return literalExprWithRange;
}
IToken opName = consume(IToken.tIDENTIFIER);
((CPPASTLiteralExpression) literalExprWithRange).addSuffix(opName.getCharImage());
((CPPASTLiteralExpression) literalExprWithRange).setSuffix(opName.getCharImage());
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.IType;
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.parser.Keywords;
@ -220,8 +221,7 @@ public abstract class AccessorFactory {
CPPASTName parameterName = getSetterParameterName();
if (Arrays.equals(fieldName.getSimpleID(), parameterName.getSimpleID())) {
CPPASTFieldReference fieldRef = new CPPASTFieldReference();
CPPASTLiteralExpression litExpr = new CPPASTLiteralExpression();
litExpr.setValue(Keywords.cTHIS);
CPPASTLiteralExpression litExpr = new CPPASTLiteralExpression(ICPPASTLiteralExpression.lk_this, Keywords.cTHIS);
fieldRef.setFieldOwner(litExpr);
fieldRef.setIsPointerDereference(true);
fieldRef.setFieldName(fieldName.copy(CopyStyle.withLocations));