https://llvm.org/bugs/show_bug.cgi?id=25875
Bug ID: 25875 Summary: differing results between clang-cl and MSVC when preprocessing Product: clang Version: unspecified Hardware: PC OS: Windows NT Status: NEW Severity: normal Priority: P Component: -New Bugs Assignee: unassignedclangb...@nondot.org Reporter: froy...@gmail.com CC: llvm-bugs@lists.llvm.org Classification: Unclassified The following test case, reduced from real-world code in Firefox, generates valid C++ source code when preprocessed with MSVC 2013 (and gcc/clang on Linux) and produces errors with clang-cl: /* from configure */ # define JS_CODEGEN_X86 1 /* from mozilla/MacroArgs.h */ #define MOZ_PASTE_PREFIX_AND_ARG_COUNT(aPrefix, ...) \ MOZ_MACROARGS_ARG_COUNT_HELPER((__VA_ARGS__, \ aPrefix##50, aPrefix##49, aPrefix##48, aPrefix##47, aPrefix##46, \ aPrefix##45, aPrefix##44, aPrefix##43, aPrefix##42, aPrefix##41, \ aPrefix##40, aPrefix##39, aPrefix##38, aPrefix##37, aPrefix##36, \ aPrefix##35, aPrefix##34, aPrefix##33, aPrefix##32, aPrefix##31, \ aPrefix##30, aPrefix##29, aPrefix##28, aPrefix##27, aPrefix##26, \ aPrefix##25, aPrefix##24, aPrefix##23, aPrefix##22, aPrefix##21, \ aPrefix##20, aPrefix##19, aPrefix##18, aPrefix##17, aPrefix##16, \ aPrefix##15, aPrefix##14, aPrefix##13, aPrefix##12, aPrefix##11, \ aPrefix##10, aPrefix##9, aPrefix##8, aPrefix##7, aPrefix##6, \ aPrefix##5, aPrefix##4, aPrefix##3, aPrefix##2, aPrefix##1, aPrefix##0)) #define MOZ_MACROARGS_ARG_COUNT_HELPER(aArgs) \ MOZ_MACROARGS_ARG_COUNT_HELPER2 aArgs #define MOZ_MACROARGS_ARG_COUNT_HELPER2( \ a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \ a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, \ a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, \ a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, \ a51, ...) a51 /* * MOZ_ARGS_AFTER_N expands to its arguments excluding the first |N| * arguments. For example: * * MOZ_ARGS_AFTER_2(a, b, c, d) expands to: c, d */ #define MOZ_ARGS_AFTER_1(a1, ...) __VA_ARGS__ #define MOZ_ARGS_AFTER_2(a1, a2, ...) __VA_ARGS__ /* * MOZ_ARG_N expands to its |N|th argument. */ #define MOZ_ARG_1(a1, ...) a1 #define MOZ_ARG_2(a1, a2, ...) a2 /* from mozilla/MacroForEach.h */ #define MOZ_FOR_EACH_EXPAND_HELPER(...) __VA_ARGS__ #define MOZ_FOR_EACH_GLUE(a, b) a b #define MOZ_FOR_EACH(aMacro, aFixedArgs, aArgs) \ MOZ_FOR_EACH_GLUE( \ MOZ_PASTE_PREFIX_AND_ARG_COUNT(MOZ_FOR_EACH_, \ MOZ_FOR_EACH_EXPAND_HELPER aArgs), \ (aMacro, aFixedArgs, aArgs)) #define MOZ_FOR_EACH_HELPER_GLUE(a, b) a b #define MOZ_FOR_EACH_HELPER(aMacro, aFixedArgs, aArgs) \ MOZ_FOR_EACH_HELPER_GLUE( \ aMacro, \ (MOZ_FOR_EACH_EXPAND_HELPER aFixedArgs MOZ_ARG_1 aArgs)) #define MOZ_FOR_EACH_1(m, fa, a) \ MOZ_FOR_EACH_HELPER(m, fa, a) #define MOZ_FOR_EACH_2(m, fa, a) \ MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_1(m, fa, (MOZ_ARGS_AFTER_1 a)) /* from MacroAssembler.h */ # define DEFINED_ON_x86 # define DEFINED_ON_x64 # define DEFINED_ON_x86_shared # define DEFINED_ON_arm # define DEFINED_ON_arm64 # define DEFINED_ON_mips32 # define DEFINED_ON_mips64 # define DEFINED_ON_mips_shared # define DEFINED_ON_none // Specialize for each architecture. #if defined(JS_CODEGEN_X86) # undef DEFINED_ON_x86 # define DEFINED_ON_x86 define # undef DEFINED_ON_x86_shared # define DEFINED_ON_x86_shared define #elif defined(JS_CODEGEN_X64) # undef DEFINED_ON_x64 # define DEFINED_ON_x64 define # undef DEFINED_ON_x86_shared # define DEFINED_ON_x86_shared define #elif defined(JS_CODEGEN_ARM) # undef DEFINED_ON_arm # define DEFINED_ON_arm define #elif defined(JS_CODEGEN_ARM64) # undef DEFINED_ON_arm64 # define DEFINED_ON_arm64 define #elif defined(JS_CODEGEN_MIPS32) # undef DEFINED_ON_mips32 # define DEFINED_ON_mips32 define # undef DEFINED_ON_mips_shared # define DEFINED_ON_mips_shared define #elif defined(JS_CODEGEN_MIPS64) # undef DEFINED_ON_mips64 # define DEFINED_ON_mips64 define # undef DEFINED_ON_mips_shared # define DEFINED_ON_mips_shared define #elif defined(JS_CODEGEN_NONE) # undef DEFINED_ON_none # define DEFINED_ON_none crash #else # error "Unknown architecture!" #endif # define DEFINED_ON_RESULT_crash { MOZ_CRASH(); } # define DEFINED_ON_RESULT_define # define DEFINED_ON_RESULT_ = delete # define DEFINED_ON_DISPATCH_RESULT_2(Macro, Result) \ Macro ## Result # define DEFINED_ON_DISPATCH_RESULT(...) \ DEFINED_ON_DISPATCH_RESULT_2(DEFINED_ON_RESULT_, __VA_ARGS__) // We need to let the evaluation of MOZ_FOR_EACH terminate. # define DEFINED_ON_EXPAND_ARCH_RESULTS_3(ParenResult) \ DEFINED_ON_DISPATCH_RESULT ParenResult # define DEFINED_ON_EXPAND_ARCH_RESULTS_2(ParenResult) \ DEFINED_ON_EXPAND_ARCH_RESULTS_3 (ParenResult) # define DEFINED_ON_EXPAND_ARCH_RESULTS(ParenResult) \ DEFINED_ON_EXPAND_ARCH_RESULTS_2 (ParenResult) # define DEFINED_ON_FWDARCH(Arch) DEFINED_ON_ ## Arch # define DEFINED_ON_MAP_ON_ARCHS(ArchList) \ DEFINED_ON_EXPAND_ARCH_RESULTS( \ (MOZ_FOR_EACH(DEFINED_ON_FWDARCH, (), ArchList))) # define DEFINED_ON(...) \ DEFINED_ON_MAP_ON_ARCHS((none, __VA_ARGS__)) # define PER_ARCH DEFINED_ON(ALL_ARCH) # define PER_SHARED_ARCH DEFINED_ON(ALL_SHARED_ARCH) class Example { public: Example(); void arm_only_function() DEFINED_ON(arm); void arm64_only_function() DEFINED_ON(arm64); void x86_only_function() DEFINED_ON(x86); }; -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs