Skip to content

C++ codegen: importcpp breaks for generic types. #7653

@nigredo-tori

Description

@nigredo-tori

This code:

type Vector* {.importcpp: "std::vector", header: "<vector>", nodecl.} [T] = object
proc mkVector*[T]: Vector[T] {.importcpp: "std::vector<'*0>()", header: "<vector>", constructor, nodecl.}

proc foo(): Vector[cint] =
  mkVector[cint]()

proc bar(): Vector[cstring] =
  mkVector[cstring]()

, when compiled with

nim cpp codegen_bug.nim

, produces incorrect return type in the generated C++ code (both functions are declared to return vector<int>):

typedef std::vector<int>  TY_lsra5sU08ga9bO3llT5YRoA;

/* irrelevant code here */

N_LIB_PRIVATE N_NIMCALL(TY_lsra5sU08ga9bO3llT5YRoA, foo_mtEaLGWplUQxutU9alIWbUw)(void) {
	TY_lsra5sU08ga9bO3llT5YRoA result;
	nimfr_("foo", "codegen_bug.nim");
	nimln_(5, "codegen_bug.nim");
	result = std::vector<int>();
	popFrame();
	return result;
}

N_LIB_PRIVATE N_NIMCALL(TY_lsra5sU08ga9bO3llT5YRoA, bar_mtEaLGWplUQxutU9alIWbUw_2)(void) {
	TY_lsra5sU08ga9bO3llT5YRoA result;
	nimfr_("bar", "codegen_bug.nim");
	nimln_(8, "codegen_bug.nim");
	result = std::vector<NCSTRING>();
	popFrame();
	return result;
}

, resulting in this error:

/home/dmitry/work/tmp/nimcache/codegen_bug.cpp: In function ‘TY_lsra5sU08ga9bO3llT5YRoA bar_mtEaLGWplUQxutU9alIWbUw_2()’:
/home/dmitry/work/tmp/nimcache/codegen_bug.cpp:78:33: error: no match for ‘operator=’ (operand types are ‘TY_lsra5sU08ga9bO3llT5YRoA {aka std::vector<int>}’ and ‘std::vector<char*>’)
  result = std::vector<NCSTRING>();

Nim version: devel (5d13e3f)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions