diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index a9313365212..cba231e11ef 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -11558,13 +11558,10 @@ public class AST2CPPTests extends AST2TestBase { } // // Test name lacking a space + // int operator ""X(const char* s) { return 0; } // int operator ""_X(const char* s) { return 0; } public void testUserDefinedLiteralNoWhiteSpace1() throws Exception { - IASTTranslationUnit tu = parse(getAboveComment(), CPP, true, false); - IASTDeclaration decl = tu.getDeclarations()[0]; - - assertTrue(decl instanceof IASTProblemDeclaration); - assertEquals(IProblem.SYNTAX_ERROR, ((IASTProblemDeclaration)decl).getProblem().getID()); + parseAndCheckBindings(); } // // Test literals with spaces before the suffix 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 88bfba0f6d2..bf86c426abf 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 @@ -851,6 +851,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { op= OverloadableOperator.SHIFTR; break; case IToken.tSTRING: // User defined literal T operator "" SUFFIX + { IToken strOp = consume(); // Should be an empty string @@ -859,11 +860,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken ident = consume(IToken.tIDENTIFIER); - // Make sure there is at least one white space - if (ident.getOffset() <= endOffset) { - break; - } - char[] operatorName = CharArrayUtils.concat(firstToken.getCharImage(), " ".toCharArray()); //$NON-NLS-1$ operatorName = CharArrayUtils.concat(operatorName, strOp.getCharImage()); operatorName = CharArrayUtils.concat(operatorName, ident.getCharImage()); @@ -873,6 +869,26 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return name; } break; + } + case IToken.tUSER_DEFINED_STRING_LITERAL: // User defined literal T operator ""SUFFIX + { + IToken strOp = consume(); + String image = strOp.getImage(); + int startQuote = image.indexOf('"'); + int endQuote = image.lastIndexOf('"'); + if (startQuote != -1 && endQuote == startQuote + 1) { + char[] ident = image.substring(endQuote + 1).toCharArray(); + + char[] operatorName = CharArrayUtils.concat(firstToken.getCharImage(), " ".toCharArray()); //$NON-NLS-1$ + operatorName = CharArrayUtils.concat(operatorName, strOp.getCharImage()); + operatorName = CharArrayUtils.concat(operatorName, ident); + + IASTName name = getNodeFactory().newOperatorName(operatorName); + setRange(name, firstToken.getOffset(), strOp.getEndOffset()); + return name; + } + break; + } default: op= OverloadableOperator.valueOf(LA(1)); if (op != null) {