From c8a87c8e6dbd683e5e8a33e7ea6ab352e8417e4b Mon Sep 17 00:00:00 2001 From: Mike Kucera Date: Wed, 1 Apr 2009 21:56:45 +0000 Subject: [PATCH] Bug 270892, wide string literals have wrong type --- .../core/parser/tests/ast2/AST2CPPTests.java | 25 ++++++++++++++++++- .../parser/cpp/CPPASTLiteralExpression.java | 8 ++++-- 2 files changed, 30 insertions(+), 3 deletions(-) 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 03c36564b14..22e6a5c1970 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 @@ -7085,5 +7085,28 @@ public class AST2CPPTests extends AST2BaseTest { public void testInvalidUserDefinedConversion_Bug269729() throws Exception { BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); ba.assertProblem("test(c)", 4); - } + } + + + // int foo(char * x); + // int foo(wchar_t * x); + // int foo(char x); + // int foo(wchar_t x); + // + // int main() { + // foo("asdf"); + // foo(L"asdf"); + // foo('a'); + // foo(L'a'); + // } + public void testWideCharacterLiteralTypes_Bug270892() throws Exception { + IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + + assertSame(col.getName(0).resolveBinding(), col.getName(9).resolveBinding()); + assertSame(col.getName(2).resolveBinding(), col.getName(10).resolveBinding()); + assertSame(col.getName(4).resolveBinding(), col.getName(11).resolveBinding()); + assertSame(col.getName(6).resolveBinding(), col.getName(12).resolveBinding()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java index 9965e5ecd89..de838dca057 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLiteralExpression.java @@ -98,19 +98,23 @@ public class CPPASTLiteralExpression extends ASTNode implements ICPPASTLiteralEx case lk_false: return new CPPBasicType(ICPPBasicType.t_bool, 0, this); case lk_char_constant: - return new CPPBasicType(IBasicType.t_char, 0, this); + return new CPPBasicType(getCharType(), 0, this); case lk_float_constant: return classifyTypeOfFloatLiteral(); case lk_integer_constant: return classifyTypeOfIntLiteral(); case lk_string_literal: - IType type = new CPPBasicType(IBasicType.t_char, 0, this); + IType type = new CPPBasicType(getCharType(), 0, this); type = new CPPQualifierType(type, true, false); return new CPPArrayType(type); } return null; } + private int getCharType() { + return getValue()[0] == 'L' ? ICPPBasicType.t_wchar_t : IBasicType.t_char; + } + private IType classifyTypeOfFloatLiteral() { final char[] lit= getValue(); final int len= lit.length;