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:
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());
|
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; }
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
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());
|
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();
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Reference in a new issue