@Override
 public ICPPTemplateArgument getExpansionPattern() {
   IType type = fEvaluation.getTypeOrFunctionSet(null);
   if (type instanceof ICPPParameterPackType) {
     IType t = ((ICPPParameterPackType) type).getType();
     if (t != null) {
       ICPPEvaluation evaluation;
       if (fEvaluation instanceof EvalParameterPack) {
         evaluation = ((EvalParameterPack) fEvaluation).getExpansionPattern();
       } else {
         evaluation = new EvalTypeId(t, fEvaluation.getTemplateDefinition(), fEvaluation);
       }
       return new CPPTemplateNonTypeArgument(evaluation, null);
     }
   }
   return null;
 }
 public CPPTemplateNonTypeArgument(ICPPEvaluation evaluation, IASTNode point) {
   Assert.isNotNull(evaluation);
   if (evaluation instanceof EvalFixed
       || point == null
       || evaluation.isTypeDependent()
       || evaluation.isValueDependent()) {
     fEvaluation = evaluation;
   } else {
     IValue value = evaluation.getValue(point);
     // Avoid nesting EvalFixed's as nesting causes the signature to be different.
     if (value.getEvaluation() instanceof EvalFixed) {
       fEvaluation = value.getEvaluation();
     } else {
       fEvaluation =
           new EvalFixed(
               evaluation.getTypeOrFunctionSet(point), evaluation.getValueCategory(point), value);
     }
   }
 }
 @Override
 public boolean isPackExpansion() {
   return fEvaluation.getTypeOrFunctionSet(null) instanceof ICPPParameterPackType;
 }
 @Override
 public IType getTypeOfNonTypeValue() {
   return fEvaluation.getTypeOrFunctionSet(null);
 }
 @Override
 public IValue getNonTypeValue() {
   return fEvaluation.getValue(null);
 }