From 47fe12a1793f1ee5ba7f3b20dd7081a5be8466c0 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Wed, 30 Aug 2017 19:20:50 -0400 Subject: [PATCH] Bug 521543 - Correctly identify narrowing conversion to boolean Change-Id: I07672f5043cbb68070185d3d7d4993794b9caa2b --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 14 ++++++++++++++ .../core/dom/parser/ArithmeticConversion.java | 3 +++ 2 files changed, 17 insertions(+) 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 fa70316b125..3259e16e93b 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 @@ -9850,6 +9850,20 @@ public class AST2CPPTests extends AST2CPPTestBase { dtor= (IASTImplicitNameOwner) name.getParent(); assertSame(ctor3, dtor.getImplicitNames()[0].resolveBinding()); } + + // struct S { + // bool a; + // int b; + // }; + // + // void waldo(S); + // + // int main() { + // waldo({1, 2}); + // } + public void testIntToBoolConversionInInitList_521543() throws Exception { + parseAndCheckBindings(); + } // namespace A { // inline namespace B { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ArithmeticConversion.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ArithmeticConversion.java index 26728ebdc3c..0c9937daa5b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ArithmeticConversion.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ArithmeticConversion.java @@ -341,6 +341,9 @@ public abstract class ArithmeticConversion { public static boolean fitsIntoType(IBasicType basicTarget, long n) { final Kind kind = basicTarget.getKind(); switch (kind) { + case eBoolean: + return n == 0 || n == 1; + case eInt: if (!basicTarget.isUnsigned()) { if (basicTarget.isShort()) {