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 48245376d38..1ca040fd7e4 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 @@ -21,6 +21,7 @@ import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.XVALUE; import static org.eclipse.cdt.core.parser.ParserLanguage.CPP; import static org.eclipse.cdt.core.parser.tests.VisibilityAsserts.assertVisibility; +import static org.junit.Assert.assertNotEquals; import java.io.BufferedReader; import java.io.IOException; @@ -9079,6 +9080,15 @@ public class AST2CPPTests extends AST2TestBase { long BSize = SizeofCalculator.getSizeAndAlignment(B, nameB).size; assertEquals(pointerSize, BSize); } + + // struct waldo {}; + public void testSizeofEmptyStruct_457770() throws Exception { + BindingAssertionHelper bh = getAssertionHelper(); + IASTName nameWaldo = bh.findName("waldo"); + ICPPClassType waldo = (ICPPClassType) nameWaldo.resolveBinding(); + long waldoSize = SizeofCalculator.getSizeAndAlignment(waldo, nameWaldo).size; + assertNotEquals(0, waldoSize); + } // template struct B {}; // template <> diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java index 7ad41a90f8e..0be0ea437d7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java @@ -329,8 +329,9 @@ public class SizeofCalculator { if (maxAlignment < info.alignment) maxAlignment = info.alignment; } - if (size > 0) - size += maxAlignment - (size - 1) % maxAlignment - 1; + if (size == 0) // a structure cannot have size 0 + size = 1; + size += maxAlignment - (size - 1) % maxAlignment - 1; return new SizeAndAlignment(size, maxAlignment); }