diff options
author | Markus Schorn | 2011-07-20 12:01:49 +0000 |
---|---|---|
committer | Markus Schorn | 2011-07-20 12:01:49 +0000 |
commit | d226e960f9c1b40edd2dadefa005d092d1831fdf (patch) | |
tree | 40b0a302267962d58583132e74656395a4d46983 | |
parent | 34fdfb11964bdd89930641b0bff118f089fdb126 (diff) | |
download | org.eclipse.cdt-d226e960f9c1b40edd2dadefa005d092d1831fdf.tar.gz org.eclipse.cdt-d226e960f9c1b40edd2dadefa005d092d1831fdf.tar.xz org.eclipse.cdt-d226e960f9c1b40edd2dadefa005d092d1831fdf.zip |
Bug 351609: Adjust parameter types in instantiated function type.
3 files changed, 22 insertions, 1 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index bb429562e67..3e1bc2db256 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5402,4 +5402,18 @@ public class AST2TemplateTests extends AST2BaseTest { public void testAddressOfMethodForInstantiation_Bug344310() throws Exception { parseAndCheckBindings(); } + + // template<typename Arg> struct Callback { + // Callback(void (*function)(Arg arg)) {} + // }; + // + // void Subscribe(const Callback<const int>& callback){} + // void CallMe(const int){} + // + // int test() { + // Subscribe(Callback<const int>(&CallMe)); // invalid arguments, symbol not + // } + public void testParameterAdjustementInInstantiatedFunctionType_351609() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index a8c9c6cb1b7..cb5e1389025 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1054,6 +1054,13 @@ public class CPPTemplates { if (ret == r && params == ps) { return type; } + // The parameter types need to be adjusted. + for (int i=0; i<params.length; i++) { + IType p= params[i]; + if (!isDependentType(p)) { + params[i]= CPPVisitor.adjustParameterType(p, true); + } + } return new CPPFunctionType(ret, params, ft.isConst(), ft.isVolatile(), ft.takesVarArgs()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 2599107a734..049f19d97f4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1723,7 +1723,7 @@ public class CPPVisitor extends ASTQueries { * Adjusts the parameter type according to 8.3.5-3: * cv-qualifiers are deleted, arrays and function types are converted to pointers. */ - private static IType adjustParameterType(final IType pt, boolean forFunctionType) { + static IType adjustParameterType(final IType pt, boolean forFunctionType) { // bug 239975 IType t= SemanticUtil.getNestedType(pt, TDEF); if (t instanceof IArrayType) { |