@@ -617,6 +617,186 @@ fn test_macro_fallback_non_system_dir() {
617617 }
618618}
619619
620+ #[ test]
621+ fn test_macro_fallback_header_contents ( ) {
622+ if let Some ( ( 9 , _) ) = clang_version ( ) . parsed {
623+ return ;
624+ }
625+
626+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
627+ let actual = builder ( )
628+ . disable_header_comment ( )
629+ . header_contents (
630+ "test.h" ,
631+ "#define UINT32_C(c) c ## U\n \
632+ #define SIMPLE 42\n \
633+ #define COMPOUND UINT32_C(69)\n ",
634+ )
635+ . clang_macro_fallback ( )
636+ . clang_macro_fallback_build_dir ( tmpdir. path ( ) )
637+ . clang_arg ( "--target=x86_64-unknown-linux" )
638+ . generate ( )
639+ . unwrap ( )
640+ . to_string ( ) ;
641+
642+ let actual = format_code ( actual) . unwrap ( ) ;
643+ let expected = format_code (
644+ "pub const SIMPLE: u32 = 42;\n pub const COMPOUND: u32 = 69;\n " ,
645+ )
646+ . unwrap ( ) ;
647+
648+ assert_eq ! ( expected, actual) ;
649+ }
650+
651+ #[ test]
652+ fn test_macro_fallback_header_contents_preserves_build_dir_files ( ) {
653+ if let Some ( ( 9 , _) ) = clang_version ( ) . parsed {
654+ return ;
655+ }
656+
657+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
658+ let victim = tmpdir. path ( ) . join ( ".macro_eval_header_0.h" ) ;
659+ fs:: write ( & victim, "must survive\n " ) . unwrap ( ) ;
660+
661+ let actual = builder ( )
662+ . disable_header_comment ( )
663+ . header_contents (
664+ "test.h" ,
665+ "#define UINT32_C(c) c ## U\n \
666+ #define COMPOUND UINT32_C(69)\n ",
667+ )
668+ . clang_macro_fallback ( )
669+ . clang_macro_fallback_build_dir ( tmpdir. path ( ) )
670+ . clang_arg ( "--target=x86_64-unknown-linux" )
671+ . generate ( )
672+ . unwrap ( )
673+ . to_string ( ) ;
674+
675+ let actual = format_code ( actual) . unwrap ( ) ;
676+ let expected = format_code ( "pub const COMPOUND: u32 = 69;\n " ) . unwrap ( ) ;
677+
678+ assert_eq ! ( expected, actual) ;
679+ assert_eq ! ( "must survive\n " , fs:: read_to_string( victim) . unwrap( ) ) ;
680+ }
681+
682+ #[ test]
683+ fn test_macro_fallback_header_contents_preserves_primary_header_order ( ) {
684+ if let Some ( ( 9 , _) ) = clang_version ( ) . parsed {
685+ return ;
686+ }
687+
688+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
689+ let header = tmpdir. path ( ) . join ( "primary.h" ) ;
690+ fs:: write (
691+ & header,
692+ "#undef ORDER_VALUE\n #define ORDER_VALUE UINT32_C(1)\n " ,
693+ )
694+ . unwrap ( ) ;
695+
696+ let actual = builder ( )
697+ . disable_header_comment ( )
698+ . header ( header. to_str ( ) . unwrap ( ) )
699+ . header_contents (
700+ "override.h" ,
701+ "#define UINT32_C(c) c ## U\n \
702+ #undef ORDER_VALUE\n \
703+ #define ORDER_VALUE UINT32_C(2)\n ",
704+ )
705+ . clang_macro_fallback ( )
706+ . clang_macro_fallback_build_dir ( tmpdir. path ( ) )
707+ . clang_arg ( "--target=x86_64-unknown-linux" )
708+ . generate ( )
709+ . unwrap ( )
710+ . to_string ( ) ;
711+
712+ let actual = format_code ( actual) . unwrap ( ) ;
713+ let expected = format_code ( "pub const ORDER_VALUE: u32 = 1;\n " ) . unwrap ( ) ;
714+
715+ assert_eq ! ( expected, actual) ;
716+ }
717+
718+ #[ test]
719+ fn test_macro_fallback_header_contents_preserves_include_identity ( ) {
720+ if let Some ( ( 9 , _) ) = clang_version ( ) . parsed {
721+ return ;
722+ }
723+
724+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
725+ let header = tmpdir. path ( ) . join ( "primary.h" ) ;
726+ fs:: write (
727+ & header,
728+ "#undef BINDGEN_VIRTUAL_FUNC_3353\n \
729+ #include \" bindgen_virtual_dependency_3353.h\" \n \
730+ #define FROM_INCLUDE BINDGEN_VIRTUAL_FUNC_3353(7)\n ",
731+ )
732+ . unwrap ( ) ;
733+ let virtual_dir = tmpdir. path ( ) . join ( "virtual" ) ;
734+ fs:: create_dir ( & virtual_dir) . unwrap ( ) ;
735+ let virtual_header = virtual_dir. join ( "bindgen_virtual_dependency_3353.h" ) ;
736+
737+ let actual = builder ( )
738+ . disable_header_comment ( )
739+ . header ( header. to_str ( ) . unwrap ( ) )
740+ . header_contents (
741+ virtual_header. to_str ( ) . unwrap ( ) ,
742+ "#define BINDGEN_VIRTUAL_FUNC_3353(c) c ## U\n " ,
743+ )
744+ . clang_macro_fallback ( )
745+ . clang_macro_fallback_build_dir ( tmpdir. path ( ) )
746+ . clang_arg ( format ! ( "-I{}" , virtual_dir. display( ) ) )
747+ . clang_arg ( "--target=x86_64-unknown-linux" )
748+ . generate ( )
749+ . unwrap ( )
750+ . to_string ( ) ;
751+
752+ let actual = format_code ( actual) . unwrap ( ) ;
753+ let expected = format_code ( "pub const FROM_INCLUDE: u32 = 7;\n " ) . unwrap ( ) ;
754+
755+ assert_eq ! ( expected, actual) ;
756+ }
757+
758+ #[ test]
759+ fn test_macro_fallback_header_contents_preserves_full_include_identity ( ) {
760+ if let Some ( ( 9 , _) ) = clang_version ( ) . parsed {
761+ return ;
762+ }
763+
764+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
765+ let header = tmpdir. path ( ) . join ( "primary.h" ) ;
766+ fs:: write ( & header, "#define FROM_COMMON COMMON_MACRO(9)\n " ) . unwrap ( ) ;
767+
768+ let virtual_dir = tmpdir. path ( ) . join ( "virtual" ) ;
769+ let a_dir = virtual_dir. join ( "a" ) ;
770+ let b_dir = virtual_dir. join ( "b" ) ;
771+ fs:: create_dir_all ( & a_dir) . unwrap ( ) ;
772+ fs:: create_dir_all ( & b_dir) . unwrap ( ) ;
773+ let a_header = a_dir. join ( "common.h" ) ;
774+ let b_header = b_dir. join ( "common.h" ) ;
775+
776+ let actual = builder ( )
777+ . disable_header_comment ( )
778+ . header ( header. to_str ( ) . unwrap ( ) )
779+ . header_contents (
780+ a_header. to_str ( ) . unwrap ( ) ,
781+ "#define COMMON_MACRO(c) 0\n " ,
782+ )
783+ . header_contents (
784+ b_header. to_str ( ) . unwrap ( ) ,
785+ "#undef COMMON_MACRO\n #define COMMON_MACRO(c) c ## U\n " ,
786+ )
787+ . clang_macro_fallback ( )
788+ . clang_macro_fallback_build_dir ( tmpdir. path ( ) )
789+ . clang_arg ( "--target=x86_64-unknown-linux" )
790+ . generate ( )
791+ . unwrap ( )
792+ . to_string ( ) ;
793+
794+ let actual = format_code ( actual) . unwrap ( ) ;
795+ let expected = format_code ( "pub const FROM_COMMON: u32 = 9;\n " ) . unwrap ( ) ;
796+
797+ assert_eq ! ( expected, actual) ;
798+ }
799+
620800#[ test]
621801// Doesn't support executing sh file on Windows.
622802// We may want to implement it in Rust so that we support all systems.
0 commit comments