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:
parent
86c3d8eeca
commit
3e66e22aed
8 changed files with 464 additions and 341 deletions
|
@ -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; }
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Reference in a new issue