1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Bug 486671 - Store value of variable template in index

Change-Id: Ifd045faca2f95be8b3e53da49b4c50b0a3c470b3
This commit is contained in:
Nathan Ridge 2016-06-13 13:02:04 -04:00
parent 3f64140125
commit 3c8a5002ba
4 changed files with 23 additions and 7 deletions

View file

@ -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 <typename T>
// constexpr bool templ = true;
// struct A {};
// constexpr bool waldo = templ<A>;
public void testStorageOfUninstantiatedValue_bug486671() {
checkBindings();
IVariable waldo = getBindingFromASTName("waldo", 5);
assertVariableValue(waldo, 1);
}
}

View file

@ -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);
}
}

View file

@ -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));
}
}

View file

@ -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);
}