diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index d6afa8b3022..7cd2e589369 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5713,4 +5713,14 @@ public class AST2TemplateTests extends AST2BaseTest { public void testPartialClassTemplateSpecUsingDefaultArgument_367997() throws Exception { parseAndCheckBindings(); } + + // struct two { char x[2]; }; + // two check(...); + // char check(int); + // template struct foo {}; + // template <> struct foo<1> { typedef int type; }; + // typedef foo::type t; // ERROR HERE + public void testValueForSizeofExpression_368309() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index 5d212fc4ee1..0e635c650f3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -580,13 +580,16 @@ public class Value implements IValue { final int unaryOp= ue.getOperator(); if (unaryOp == IASTUnaryExpression.op_sizeof) { - IType type = ue.getExpressionType(); - ASTTranslationUnit ast = (ASTTranslationUnit) ue.getTranslationUnit(); - SizeofCalculator calculator = ast.getSizeofCalculator(); - SizeAndAlignment info = calculator.sizeAndAlignment(type); - if (info == null) - throw UNKNOWN_EX; - return info.size; + final IASTExpression operand = ue.getOperand(); + if (operand != null) { + IType type = operand.getExpressionType(); + ASTTranslationUnit ast = (ASTTranslationUnit) ue.getTranslationUnit(); + SizeofCalculator calculator = ast.getSizeofCalculator(); + SizeAndAlignment info = calculator.sizeAndAlignment(type); + if (info != null) + return info.size; + } + throw UNKNOWN_EX; } if (unaryOp == IASTUnaryExpression.op_amper || unaryOp == IASTUnaryExpression.op_star ||