diff --git a/Dockerfile.dev b/Dockerfile.dev index b553fc5..2738fe7 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -53,7 +53,7 @@ RUN ./build-mingw-w64-libraries.sh $TOOLCHAIN_PREFIX # Build C test applications ENV PATH=$TOOLCHAIN_PREFIX/bin:$PATH -COPY test/*.c test/*.h ./test/ +COPY test/*.c test/*.h test/*.idl ./test/ RUN cd test && \ for arch in $TOOLCHAIN_ARCHS; do \ mkdir -p $arch && \ @@ -66,6 +66,11 @@ RUN cd test && \ for test in autoimport-main; do \ $arch-w64-mingw32-clang $test.c -o $arch/$test.exe -L$arch -l${test%-main}-lib || exit 1; \ done; \ + for test in idltest; do \ + # The IDL output isn't arch specific, but test each arch frontend \ + $arch-w64-mingw32-widl $test.idl -h -o $arch/$test.h && \ + $arch-w64-mingw32-clang $test.c -I$arch -o $arch/$test.exe -lole32 || exit 1; \ + done; \ done # Build libunwind/libcxxabi/libcxx diff --git a/run-tests.sh b/run-tests.sh index 3e6f216..21f246b 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -70,6 +70,7 @@ TESTS_SSP="stacksmash" TESTS_ASAN="stacksmash" TESTS_UBSAN="ubsan" TESTS_UWP="uwp-error" +TESTS_IDL="idltest" TESTS_OTHER_TARGETS="hello" for arch in $ARCHS; do case $arch in @@ -141,6 +142,13 @@ for arch in $ARCHS; do for test in $TESTS_SSP; do $arch-w64-mingw32-clang $test.c -o $TEST_DIR/$test.exe -fstack-protector-strong done + for test in $TESTS_IDL; do + # This is primary a build-only test, so no need to execute it. + # The IDL output isn't arch specific, but we want to test the + # individual widl frontends. + $arch-w64-mingw32-widl $test.idl -h -o $TEST_DIR/$test.h + $arch-w64-mingw32-clang $test.c -I$TEST_DIR -o $TEST_DIR/$test.exe -lole32 + done for target_os in $TARGET_OSES; do for test in $TESTS_UWP; do set +e diff --git a/test/idltest.c b/test/idltest.c new file mode 100644 index 0000000..6bf0a14 --- /dev/null +++ b/test/idltest.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#define COBJMACROS +#include "idltest.h" + +int main(int argc, char *argv[]) { + if (argc <= 1) + return 0; + + ITestClass *obj; + CoInitializeEx(NULL, COINIT_MULTITHREADED); + if (CoCreateInstance(&CLSID_TestClassImplementation, 0, CLSCTX_INPROC, &IID_ITestClass, (void*)&obj)) + return 0; + ITestClass_DoSomething(obj, 0); + ITestClass_Release(obj); + return 0; +} diff --git a/test/idltest.idl b/test/idltest.idl new file mode 100644 index 0000000..883dd38 --- /dev/null +++ b/test/idltest.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +import "unknwn.idl"; + +[ + uuid(73ad110f-de60-4d7a-899a-58f2afc033a7), +] +interface ITestClass : IUnknown +{ + HRESULT DoSomething([in] ULONG param); +} + +cpp_quote("DEFINE_GUID(CLSID_TestClassImplementation, 0x5247bb7c,0x51d6,0x42ce,0xa3,0xd1,0x1c,0xe9,0x65,0xf6,0x93,0x72);")