diff --git a/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF
index f2ace874a42..e7817f88e0a 100644
--- a/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF
+++ b/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.cdt.codan.checkers;singleton:=true
-Bundle-Version: 3.5.400.qualifier
+Bundle-Version: 3.5.500.qualifier
Bundle-Activator: org.eclipse.cdt.codan.checkers.CodanCheckersActivator
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
diff --git a/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties b/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties
index 15bbc5c8fe0..77ebbe6e435 100644
--- a/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties
+++ b/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties
@@ -116,6 +116,9 @@ problem.name.12 = Field cannot be resolved
problem.description.13 = Name resolution problem found by the indexer
problem.messagePattern.13 = Structured binding initializer expression refers to introduced name ''{0}''
problem.name.13 = Invalid structured binding declaration
+problem.description.14 = Name resolution problem found by the indexer
+problem.messagePattern.14 = Cannot instantiate template function ''{0}''
+problem.name.14 = Function cannot be instantiated
checker.name.AbstractClassCreation = Abstract class cannot be instantiated
problem.name.AbstractClassCreation = Abstract class cannot be instantiated
problem.messagePattern.AbstractClassCreation = The type ''{0}'' must implement the inherited pure virtual method ''{1}''\u0020
diff --git a/codan/org.eclipse.cdt.codan.checkers/plugin.xml b/codan/org.eclipse.cdt.codan.checkers/plugin.xml
index 7a4d11c604f..9e63033f8ab 100644
--- a/codan/org.eclipse.cdt.codan.checkers/plugin.xml
+++ b/codan/org.eclipse.cdt.codan.checkers/plugin.xml
@@ -253,6 +253,16 @@
messagePattern="%problem.messagePattern.10"
name="%problem.name.10">
+
+
class U, T *pT > class A {
@@ -7487,7 +7487,7 @@ public class AST2TemplateTests extends AST2CPPTestBase {
public void testTemplatedAliasDeduction() throws Exception {
BindingAssertionHelper bh = getAssertionHelper();
bh.assertNonProblem("g(v)", "g", ICPPFunction.class);
- bh.assertProblem("f(v)", "f", ISemanticProblem.BINDING_NOT_FOUND);
+ bh.assertProblem("f(v)", "f", ISemanticProblem.BINDING_INVALID_TEMPLATE_INSTANTIATION);
}
// using function = void (&)(int);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java
index 7ec31006142..2cce48437f9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java
@@ -67,6 +67,8 @@ public interface IProblemBinding extends IBinding, IScope, IType, ISemanticProbl
public static final int SEMANTIC_INVALID_TEMPLATE_ARGUMENTS = BINDING_INVALID_TEMPLATE_ARGUMENTS;
/** @since 8.1 */
public static final int SEMANTIC_INVALID_STRUCTURED_BINDING_INITIALIZER = BINDING_INVALID_STRUCTURED_BINDING_INITIALIZER;
+ /** @since 8.4 */
+ public static final int SEMANTIC_INVALID_TEMPLATE_INSTANTIATION = BINDING_INVALID_TEMPLATE_INSTANTIATION;
/**
* @deprecated There may be additional problems.
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java
index 5c23def3eb8..94171e75a1c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java
@@ -39,6 +39,8 @@ public interface ISemanticProblem {
int BINDING_NO_CLASS = 16;
/** @since 8.1 */
int BINDING_INVALID_STRUCTURED_BINDING_INITIALIZER = 17;
+ /** @since 8.4 */
+ int BINDING_INVALID_TEMPLATE_INSTANTIATION = 18;
int TYPE_NO_NAME = 10000;
int TYPE_UNRESOLVED_NAME = 10001;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java
index b6d65d2112d..5a136b53329 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java
@@ -3103,10 +3103,17 @@ public class CPPSemantics {
ICPPFunction[] tmp = selectByArgumentCount(data, fns);
if (tmp.length == 0 || tmp[0] == null)
return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
+ int nbBeforeInstantiate = tmp.length;
tmp = CPPTemplates.instantiateForFunctionCall(tmp, data.getTemplateArguments(), Arrays.asList(argTypes),
Arrays.asList(data.getFunctionArgumentValueCategories()), data.argsContainImpliedObject);
- if (tmp.length == 0 || tmp[0] == null)
- return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
+ if (tmp.length == 0 || tmp[0] == null) {
+ // All candidates were failed template instantiations
+ if (nbBeforeInstantiate == fns.length)
+ return new ProblemBinding(lookupName, lookupPoint,
+ IProblemBinding.SEMANTIC_INVALID_TEMPLATE_INSTANTIATION, fns);
+ else
+ return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
+ }
int viableCount = 0;
for (IFunction f : tmp) {