mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 06:02:11 +02:00
Bug 424765 - Implicit conversion from lambda to function pointer not
recongized Change-Id: I33ae542ef428005dd2eaa5ca8010f53f04f54a27 Signed-off-by: Nathan Ridge <zeratul976@hotmail.com> Reviewed-on: https://git.eclipse.org/r/20926 Tested-by: Hudson CI Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> IP-Clean: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
This commit is contained in:
parent
0c3bdb4d24
commit
19c4c3d788
2 changed files with 29 additions and 9 deletions
|
@ -10479,4 +10479,13 @@ public class AST2CPPTests extends AST2TestBase {
|
||||||
public void testFieldWithSameNameAsClass_326750() throws Exception {
|
public void testFieldWithSameNameAsClass_326750() throws Exception {
|
||||||
parseAndCheckBindings();
|
parseAndCheckBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void waldo(void(*)());
|
||||||
|
//
|
||||||
|
// int main() {
|
||||||
|
// waldo([](){});
|
||||||
|
// }
|
||||||
|
public void testConversionFromLambdaToFunctionPointer_424765() throws Exception {
|
||||||
|
parseAndCheckBindings();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||||
import org.eclipse.cdt.core.parser.util.ObjectSet;
|
import org.eclipse.cdt.core.parser.util.ObjectSet;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
|
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClosureType;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionType;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionType;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerToMemberType;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerToMemberType;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType;
|
||||||
|
@ -99,31 +100,41 @@ public class SemanticUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an array of ICPPMethod objects representing all conversion operators
|
* Returns an array of ICPPMethod objects representing all conversion operators
|
||||||
* declared by the specified class. This does not include inherited methods. Conversion
|
* declared by the specified class, and the implicitly generated conversion
|
||||||
* operators cannot be implicit.
|
* operator for a closure type. This does not include inherited methods.
|
||||||
* @param clazz
|
* @param clazz
|
||||||
* @return an array of conversion operators.
|
* @return an array of conversion operators.
|
||||||
*/
|
*/
|
||||||
public static final ICPPMethod[] getDeclaredConversionOperators(ICPPClassType clazz, IASTNode point) throws DOMException {
|
public static final ICPPMethod[] getDeclaredConversionOperators(ICPPClassType clazz, IASTNode point) throws DOMException {
|
||||||
ICPPMethod[] methods= ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
ICPPMethod[] conversionOps= ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
||||||
if (clazz instanceof ICPPDeferredClassInstance) {
|
if (clazz instanceof ICPPDeferredClassInstance) {
|
||||||
clazz= (ICPPClassType) ((ICPPDeferredClassInstance) clazz).getTemplateDefinition();
|
clazz= (ICPPClassType) ((ICPPDeferredClassInstance) clazz).getTemplateDefinition();
|
||||||
}
|
}
|
||||||
ICPPMethod[] decs= ClassTypeHelper.getDeclaredMethods(clazz, point);
|
ICPPMethod[] methods;
|
||||||
if (decs != null) {
|
// For a closure type, getDeclaredMethods() does not return the conversion
|
||||||
for (ICPPMethod method : decs) {
|
// operator because it is implicitly generated. We can use getMethods()
|
||||||
|
// however as a closure type does not have base classes.
|
||||||
|
// A new API ICPPClosureType.getNoninheritedMethods() might be more
|
||||||
|
// appropriate here.
|
||||||
|
if (clazz instanceof CPPClosureType) {
|
||||||
|
methods = ClassTypeHelper.getMethods(clazz, point);
|
||||||
|
} else {
|
||||||
|
methods = ClassTypeHelper.getDeclaredMethods(clazz, point);
|
||||||
|
}
|
||||||
|
if (methods != null) {
|
||||||
|
for (ICPPMethod method : methods) {
|
||||||
if (isConversionOperator(method)) {
|
if (isConversionOperator(method)) {
|
||||||
methods= ArrayUtil.append(methods, method);
|
conversionOps= ArrayUtil.append(conversionOps, method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return methods;
|
return conversionOps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an array of ICPPMethod objects representing all conversion operators
|
* Returns an array of ICPPMethod objects representing all conversion operators
|
||||||
* declared by the specified class and its ancestors. This includes inherited
|
* declared by the specified class and its ancestors. This includes inherited
|
||||||
* methods. Conversion operators cannot be implicit.
|
* methods, and the implicitly generated conversion operator for a closure type.
|
||||||
* @param clazz
|
* @param clazz
|
||||||
* @return an array of conversion operators.
|
* @return an array of conversion operators.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue