diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom')
18 files changed, 143 insertions, 16 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java index 18162597b25..97a7ed6f697 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java @@ -578,6 +578,11 @@ public class PDOMASTAdapter { public ICPPScope asScope() { return ((ICPPEnumeration) fDelegate).asScope(); } + + @Override + public boolean isNoDiscard() { + return ((ICPPEnumeration) fDelegate).isNoDiscard(); + } } private static class AnonymousClassType extends AnonymousCPPBinding implements ICPPClassType { @@ -669,6 +674,11 @@ public class PDOMASTAdapter { public int getVisibility(IBinding member) { return ((ICPPClassType) fDelegate).getVisibility(member); } + + @Override + public boolean isNoDiscard() { + return ((ICPPClassType) fDelegate).isNoDiscard(); + } } private static class AnonymousClassSpecialization extends AnonymousClassType implements ICPPClassSpecialization { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index 170f025f470..42615e71cc4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -87,7 +87,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage * The set of types currently being loaded from the index on each thread, represented as record numbers. * This is used to guard against infinite recursion while loading types. */ - private static final ThreadLocal<Set<Long>> fLoadTypeInProgress = new ThreadLocal<Set<Long>>() { + private static final ThreadLocal<Set<Long>> fLoadTypeInProgress = new ThreadLocal<>() { @Override protected Set<Long> initialValue() { return new HashSet<>(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java index fcae57b3e1d..e029f880780 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java @@ -373,10 +373,9 @@ public class PDOMMacro implements IIndexMacro, IPDOMBinding { } @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Object getAdapter(Class adapter) { + public <T> T getAdapter(Class<T> adapter) { if (adapter.isAssignableFrom(PDOMMacro.class)) { - return this; + return adapter.cast(this); } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacroContainer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacroContainer.java index 266079a3009..817de429e5f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacroContainer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacroContainer.java @@ -171,10 +171,9 @@ public class PDOMMacroContainer extends PDOMNamedNode implements IIndexMacroCont } @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Object getAdapter(Class adapter) { + public <T> T getAdapter(Class<T> adapter) { if (adapter.isAssignableFrom(PDOMMacroContainer.class)) { - return this; + return adapter.cast(this); } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java index 9f73005f040..f8ac35b883f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java @@ -56,6 +56,7 @@ public final class PDOMName implements IIndexFragmentName { public static final int IS_FRIEND_SPEC = 0x08; public static final int IS_INLINE_NAMESPACE = 0x0C; public static final int COULD_BE_POLYMORPHIC_METHOD_CALL = 0x10; + //TODO We haven't got any flag for "unknown" access, we should add it to the index public static final int READ_ACCESS = 0x20; public static final int WRITE_ACCESS = 0x40; // Whether this name is a potential match for its binding, rather than an exact match. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotations.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotations.java index e842e2aeb81..64da027c55a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotations.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCAnnotations.java @@ -32,6 +32,9 @@ class PDOMCAnnotations { private static final int NO_RETURN_OFFSET = 4; private static final int REGISTER_OFFSET = 5; private static final int AUTO_OFFSET = 6; + private static final int NO_DISCARD_OFFSET = 7; + //NOTE: we are writing these annotations on a "byte" so if we need + //to add another value we need to use at least a short. /** * Encodes annotations applicable to functions. @@ -55,6 +58,8 @@ class PDOMCAnnotations { annotation |= 1 << REGISTER_OFFSET; if (function.isAuto()) annotation |= 1 << AUTO_OFFSET; + if (function.isNoDiscard()) + annotation |= 1 << NO_DISCARD_OFFSET; return annotation; } @@ -115,6 +120,13 @@ class PDOMCAnnotations { } /** + * Checks if the "no discard" annotation is set. + */ + public static boolean isNoDiscardFunction(short annotation) { + return (annotation & (1 << NO_DISCARD_OFFSET)) != 0; + } + + /** * Checks if the "register" annotation is set. */ public static boolean isRegister(byte annotation) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java index 5230308ea5f..07ddfcffbda 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java @@ -208,4 +208,9 @@ class PDOMCFunction extends PDOMBinding implements IFunction { public IScope getFunctionScope() { return null; } + + @Override + public boolean isNoDiscard() { + return PDOMCAnnotations.isNoDiscardFunction(getAnnotations()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java index bfe51cec7a5..26cdd781a7a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java @@ -15,6 +15,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.c; +import java.util.Optional; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -138,7 +140,11 @@ class PDOMCVariable extends PDOMBinding implements IVariable { @Override public int getAdditionalNameFlags(int standardFlags, IASTName name) { if ((standardFlags & PDOMName.IS_REFERENCE) == PDOMName.IS_REFERENCE) { - return CVariableReadWriteFlags.getReadWriteFlags(name); + Optional<Integer> res = CVariableReadWriteFlags.getReadWriteFlags(name); + if (!res.isPresent()) { + return PDOMName.WRITE_ACCESS | PDOMName.READ_ACCESS; + } + return res.get(); } return 0; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAnnotations.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAnnotations.java index c7c020c36b5..709f9bc84be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAnnotations.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPAnnotations.java @@ -45,6 +45,7 @@ class PDOMCPPAnnotations { private static final int PARAMETER_PACK_OFFSET = 7; private static final int DELETED_OFFSET = 8; private static final int NO_RETURN_OFFSET = 9; + private static final int NO_DISCARD_OFFSET = 10; // Method annotations that don't fit on the first 16 bits of annotations. private static final int VIRTUAL_OFFSET = 0; @@ -82,6 +83,8 @@ class PDOMCPPAnnotations { annotation |= 1 << PARAMETER_PACK_OFFSET; if (function.isDeleted()) annotation |= 1 << DELETED_OFFSET; + if (function.isNoDiscard()) + annotation |= 1 << NO_DISCARD_OFFSET; return annotation; } @@ -227,6 +230,13 @@ class PDOMCPPAnnotations { } /** + * Checks if the "no discard" annotation is set. + */ + public static boolean isNoDiscardFunction(short annotation) { + return (annotation & (1 << NO_DISCARD_OFFSET)) != 0; + } + + /** * Checks if the "virtual" annotation is set. */ public static boolean isVirtualMethod(byte annotation) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index a1161ad8cae..9e9364d6c56 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -72,10 +72,11 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization private static final byte FLAGS_FINAL = 0x01; private static final byte FLAGS_HAS_OWN_SCOPE = 0x02; + private static final byte FLAGS_NODISCARD = 0x03; private volatile ICPPClassScope fScope; private ObjectMap specializationMap; // Obtained from the synchronized PDOM cache. - private final ThreadLocal<Set<IBinding>> fInProgress = new ThreadLocal<Set<IBinding>>() { + private final ThreadLocal<Set<IBinding>> fInProgress = new ThreadLocal<>() { @Override protected Set<IBinding> initialValue() { return new HashSet<>(); @@ -508,6 +509,16 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization } } + @Override + public boolean isNoDiscard() { + try { + return (getFlags() & FLAGS_NODISCARD) != 0; + } catch (CoreException e) { + CCorePlugin.log(e); + return false; + } + } + private boolean hasOwnScope() throws CoreException { return (getFlags() & FLAGS_HAS_OWN_SCOPE) != 0; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 1f2e920a8ff..2d5447c2c4e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -60,8 +60,9 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO private static final int ANONYMOUS = KEY + 1; // byte private static final int FINAL = ANONYMOUS + 1; // byte private static final int VISIBLE_TO_ADL_ONLY = FINAL + 1; // byte + private static final int NO_DISCARD = VISIBLE_TO_ADL_ONLY + 1; // byte @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = VISIBLE_TO_ADL_ONLY + 1; + protected static final int RECORD_SIZE = NO_DISCARD + 1; private PDOMCPPClassScope fScope; // No need for volatile, all fields of PDOMCPPClassScope are final. @@ -73,6 +74,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO setAnonymous(classType); setFinal(classType); setVisibleToAdlOnly(visibleToAdlOnly); + setNoDiscard(classType); // Linked list is initialized by storage being zero'd by malloc. } @@ -97,6 +99,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO setKind(ct); setAnonymous(ct); setFinal(ct); + setNoDiscard(ct); super.update(linkage, newBinding); } } @@ -113,6 +116,10 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO getDB().putByte(record + FINAL, (byte) (ct.isFinal() ? 1 : 0)); } + private void setNoDiscard(ICPPClassType ct) throws CoreException { + getDB().putByte(record + NO_DISCARD, (byte) (ct.isNoDiscard() ? 1 : 0)); + } + @Override public void setVisibleToAdlOnly(boolean visibleToAdlOnly) throws CoreException { getDB().putByte(record + VISIBLE_TO_ADL_ONLY, (byte) (visibleToAdlOnly ? 1 : 0)); @@ -280,6 +287,16 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO } @Override + public boolean isNoDiscard() { + try { + return getDB().getByte(record + NO_DISCARD) != 0; + } catch (CoreException e) { + CCorePlugin.log(e); + return false; + } + } + + @Override public boolean isVisibleToAdlOnly() { try { return getDB().getByte(record + VISIBLE_TO_ADL_ONLY) != 0; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java index dc59848d72c..2319f9c6110 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java @@ -51,6 +51,9 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IPDOMCPPEnumType, IPD private static final int OFFSET_FIXED_TYPE = OFFSET_MAX_VALUE + 8; private static final int OFFSET_FLAGS = OFFSET_FIXED_TYPE + Database.TYPE_SIZE; + private static final byte FLAG_SCOPED = 0x1; + private static final byte FLAG_NODISCARD = 0x2; + @SuppressWarnings("hiding") protected static final int RECORD_SIZE = OFFSET_FLAGS + 1; @@ -75,7 +78,15 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IPDOMCPPEnumType, IPD private void storeProperties(ICPPEnumeration enumeration) throws CoreException { final Database db = getDB(); - db.putByte(record + OFFSET_FLAGS, enumeration.isScoped() ? (byte) 1 : (byte) 0); + byte flags = 0; + if (enumeration.isScoped()) { + flags |= FLAG_SCOPED; + } + if (enumeration.isNoDiscard()) { + flags |= FLAG_NODISCARD; + } + + db.putByte(record + OFFSET_FLAGS, flags); getLinkage().storeType(record + OFFSET_FIXED_TYPE, enumeration.getFixedType()); @@ -188,7 +199,18 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IPDOMCPPEnumType, IPD @Override public boolean isScoped() { try { - return getDB().getByte(record + OFFSET_FLAGS) != 0; + byte flags = getDB().getByte(record + OFFSET_FLAGS); + return (flags & FLAG_SCOPED) != 0; + } catch (CoreException e) { + return false; + } + } + + @Override + public boolean isNoDiscard() { + try { + byte flags = getDB().getByte(record + OFFSET_FLAGS); + return (flags & FLAG_NODISCARD) != 0; } catch (CoreException e) { return false; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java index 3bda300c388..2208f786de3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java @@ -51,7 +51,8 @@ class PDOMCPPEnumerationSpecialization extends PDOMCPPSpecialization private static final int OFFSET_MIN_VALUE = OFFSET_ENUMERATOR_LIST + Database.PTR_SIZE; private static final int OFFSET_MAX_VALUE = OFFSET_MIN_VALUE + 8; private static final int OFFSET_FIXED_TYPE = OFFSET_MAX_VALUE + 8; - private static final int OFFSET_FLAGS = OFFSET_FIXED_TYPE + Database.TYPE_SIZE; + private static final int OFFSET_NO_DISCARD = OFFSET_FIXED_TYPE + 8; + private static final int OFFSET_FLAGS = OFFSET_NO_DISCARD + Database.TYPE_SIZE; @SuppressWarnings("hiding") protected static final int RECORD_SIZE = OFFSET_FLAGS + 1; @@ -84,6 +85,7 @@ class PDOMCPPEnumerationSpecialization extends PDOMCPPSpecialization private void storeProperties(ICPPEnumeration enumeration) throws CoreException { final Database db = getDB(); db.putByte(record + OFFSET_FLAGS, enumeration.isScoped() ? (byte) 1 : (byte) 0); + db.putByte(record + OFFSET_NO_DISCARD, enumeration.isNoDiscard() ? (byte) 1 : (byte) 0); getLinkage().storeType(record + OFFSET_FIXED_TYPE, enumeration.getFixedType()); @@ -203,6 +205,15 @@ class PDOMCPPEnumerationSpecialization extends PDOMCPPSpecialization } @Override + public boolean isNoDiscard() { + try { + return getDB().getByte(record + OFFSET_NO_DISCARD) != 0; + } catch (CoreException e) { + return false; + } + } + + @Override public IType getFixedType() { if (fFixedType == ProblemBinding.NOT_INITIALIZED) { fFixedType = loadFixedType(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java index 6797e525149..01e8334a218 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java @@ -449,4 +449,9 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl return null; } } + + @Override + public boolean isNoDiscard() { + return PDOMCPPAnnotations.isNoDiscardFunction(getAnnotations()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java index 9b047058a57..6f62bec830b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java @@ -342,4 +342,9 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization return null; } } + + @Override + public boolean isNoDiscard() { + return PDOMCPPAnnotations.isNoDiscardFunction(getAnnotations()); + } } 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 05b9367d2f2..991f3ef73eb 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 @@ -143,6 +143,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalUnary; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalUnaryTypeID; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecBreak; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecBuiltin; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecCase; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecCompoundStatement; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecConstructorChain; @@ -1270,8 +1271,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if (owner instanceof IFunction) { boolean isTemplateParameter = binding instanceof ICPPTemplateParameter; boolean ownerIsConstexprFunc = owner instanceof ICPPFunction && ((ICPPFunction) owner).isConstexpr(); - boolean isVariableOrTypedef = binding instanceof ICPPVariable || binding instanceof ITypedef; - if (!isTemplateParameter && !(ownerIsConstexprFunc && isVariableOrTypedef)) { + boolean isVariableOrType = binding instanceof ICPPVariable || binding instanceof IType; + if (!isTemplateParameter && !(ownerIsConstexprFunc && isVariableOrType)) { return null; } } @@ -1771,6 +1772,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return ExecConstructorChain.unmarshal(firstBytes, buffer); case ITypeMarshalBuffer.EXEC_INCOMPLETE: return ExecIncomplete.unmarshal(firstBytes, buffer); + case ITypeMarshalBuffer.EXEC_BUILTIN: + return ExecBuiltin.unmarshal(firstBytes, buffer); } throw new CoreException(CCorePlugin.createStatus("Cannot unmarshal an execution, first bytes=" + firstBytes)); //$NON-NLS-1$ } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java index b33a90157cc..5c8e1a76715 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java @@ -350,6 +350,11 @@ public class PDOMCPPTemplateTemplateParameter extends PDOMCPPBinding implements } @Override + public boolean isNoDiscard() { + return false; + } + + @Override public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { int pos = param.getParameterPosition(); ICPPTemplateParameter[] pars = getTemplateParameters(); 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 6f02c5b78ee..af083b4f944 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 @@ -15,6 +15,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.Optional; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -162,7 +164,11 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable { @Override public int getAdditionalNameFlags(int standardFlags, IASTName name) { if ((standardFlags & PDOMName.IS_REFERENCE) == PDOMName.IS_REFERENCE) { - return CPPVariableReadWriteFlags.getReadWriteFlags(name); + Optional<Integer> res = CPPVariableReadWriteFlags.getReadWriteFlags(name); + if (!res.isPresent()) { + return PDOMName.READ_ACCESS | PDOMName.WRITE_ACCESS; + } + return res.get(); } return 0; } |