diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPVariableTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPVariableTemplateResolutionTest.java index 7737d52ee5e..6d3f4569d01 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPVariableTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPVariableTemplateResolutionTest.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.index.tests; +import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFieldTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariableInstance; @@ -197,4 +198,15 @@ public class IndexCPPVariableTemplateResolutionTest extends IndexBindingResoluti assertEquals(c.getClass(), ((ICPPVariableTemplatePartialSpecialization) cOfIntPtr.getSpecializedBinding()).getPrimaryTemplate().getClass()); } + + // template + // constexpr bool templ = true; + + // struct A {}; + // constexpr bool waldo = templ; + public void testStorageOfUninstantiatedValue_bug486671() { + checkBindings(); + IVariable waldo = getBindingFromASTName("waldo", 5); + assertVariableValue(waldo, 1); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 349a4b6c1ee..8aebbe507be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; @@ -505,12 +506,14 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { private final IPDOMCPPTemplateParameter[] fTemplateParameters; private final ICPPTemplateParameter[] fOriginalTemplateParameters; private final IType fOriginalType; + private final IValue fOriginalValue; public ConfigureVariableTemplate(ICPPVariableTemplate original, PDOMCPPVariable template) throws DOMException { fTemplate = template; fTemplateParameters= (IPDOMCPPTemplateParameter[]) ((ICPPVariableTemplate)template).getTemplateParameters(); fOriginalTemplateParameters= original.getTemplateParameters(); fOriginalType= original.getType(); + fOriginalValue= original.getInitialValue(); postProcesses.add(this); } @@ -521,7 +524,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if (tp != null) tp.configure(fOriginalTemplateParameters[i]); } - PDOMCPPVariableTemplate.initData(fTemplate, fOriginalType); + PDOMCPPVariableTemplate.initData(fTemplate, fOriginalType, fOriginalValue); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java index 24169180d4b..313ae61e989 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java @@ -48,13 +48,12 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable { db.putByte(record + ANNOTATIONS, encodeFlags(variable)); if (setTypeAndValue) { setType(parent.getLinkage(), variable.getType()); - setValue(db, variable); + setValue(variable.getInitialValue()); } } - private void setValue(Database db, IVariable variable) throws CoreException { - IValue val = variable.getInitialValue(); - getLinkage().storeValue(record + VALUE_OFFSET, val); + protected void setValue(IValue value) throws CoreException { + getLinkage().storeValue(record + VALUE_OFFSET, value); } @Override @@ -64,7 +63,7 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable { IVariable var= (IVariable) newBinding; IType newType= var.getType(); setType(linkage, newType); - setValue(db, var); + setValue(var.getInitialValue()); db.putByte(record + ANNOTATIONS, encodeFlags(var)); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariableTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariableTemplate.java index 5c09ad0b3f5..ab20ee8ddaf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariableTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariableTemplate.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; @@ -94,9 +95,10 @@ public class PDOMCPPVariableTemplate extends PDOMCPPVariable implements ICPPVari return RECORD_SIZE; } - public static void initData(PDOMCPPVariable binding, IType fOriginalType) { + public static void initData(PDOMCPPVariable binding, IType fOriginalType, IValue fOriginalValue) { try { binding.setType(binding.getLinkage(), fOriginalType); + binding.setValue(fOriginalValue); } catch (CoreException e) { CCorePlugin.log(e); }