Skip to content

No way to use extern_cpp_type!() for a nested type #1422

Open
@GoldsteinE

Description

@GoldsteinE

Describe the bug
extern_cpp_type!() accepts a single name as an argument, but autocxx uses two different names for nested types: outer_inner and outer::inner. As far as I’m aware, that means there’s no way to use extern_cpp_type!() for nested classes.

To Reproduce

// test.hpp
#pragma once
namespace myns {
    struct mystruct {
        enum myenum { A, B };
        mystruct(myenum) {}
    };
};
// build.rs
fn main() {
    let path = ".";
    let mut b = autocxx_build::Builder::new("src/main.rs", &[path])
        .build()
        .unwrap();
    b.flag_if_supported("-std=c++20").compile("minimal-repro");
    println!("cargo::rerun-if-changed=src/main.rs");
}
// src/main.rs
use autocxx::prelude::*;

#[cxx::bridge]
mod manual {
    #[repr(u32)]
    pub enum mystruct_myenum {
        A, B,
    }
}

include_cpp! {
    #include "test.hpp"
    safety!(unsafe)

    // variant 1: ParseError(AutocxxCodegenError(Conversion(Cpp(DidNotGenerateAnything("myns::mystruct::myenum")))))
    extern_cpp_type!("myns::mystruct::myenum", crate::manual::mystruct_myenum)
    pod!("myns::mystruct::myenum")
    // variant 2:   cargo:warning=/.../autocxx-build-dir/cxx/gen1.cxx:178:79: error: 'myns::mystruct_myenum' has not been declared
    extern_cpp_type!("myns::mystruct_myenum", crate::manual::mystruct_myenum)
    pod!("myns::mystruct_myenum")
    // variant 3:   cargo:warning=/.../autocxx-build-dir/cxx/gen1.cxx:137:79: error: 'myns::mystruct_myenum' has not been declared
    extern_cpp_type!("myns::mystruct_myenum", crate::manual::mystruct_myenum)
    // variant 4: generates, but uses autocxx-generated enum in constructor instead of extern one
    extern_cpp_type!("myns::mystruct::myenum", crate::manual::mystruct_myenum)


    generate!("myns::mystruct")
}

fn main() {
    println!("Hello, world!");
}

Expected behavior
There’s some way to specify extern_cpp_type!() for a nested enum.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingplease-raise-a-prPR requested to fix this

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions