r314235 - Allow IUnknown/IInterface types to come from extern C++
Keane, Erich via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 26 16:46:18 PDT 2017
BTW: The guy who told me about this issue ALSO discovered a different issue that that I didn't solve due to his reproducer not contining the whole testcase. I've got a patch to fix all of it in his hands right now, so I'll submit this fix with it together.
-Erich
-----Original Message-----
From: Friedman, Eli [mailto:efriedma at codeaurora.org]
Sent: Tuesday, September 26, 2017 12:06 PM
To: Keane, Erich <erich.keane at intel.com>; cfe-commits at lists.llvm.org
Subject: Re: r314235 - Allow IUnknown/IInterface types to come from extern C++
On 9/26/2017 11:55 AM, Erich Keane via cfe-commits wrote:
> Author: erichkeane
> Date: Tue Sep 26 11:55:16 2017
> New Revision: 314235
>
> URL: http://llvm.org/viewvc/llvm-project?rev=314235&view=rev
> Log:
> Allow IUnknown/IInterface types to come from extern C++
>
> It was brought up in response to my last implementation for this
> struct-as-interface features that at least 1 header in the MS SDK uses
> "extern C++" around an IUnknown declaration.
>
> The previous implementation demanded that this type exist in the
> TranslationUnit DeclContext. This small change simply also allows in
> the situation where we're extern "C++".
>
> Modified:
> cfe/trunk/lib/AST/DeclCXX.cpp
> cfe/trunk/test/SemaCXX/ms-iunknown.cpp
>
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=
> 314235&r1=314234&r2=314235&view=diff
> ======================================================================
> ========
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Tue Sep 26 11:55:16 2017
> @@ -1491,7 +1491,8 @@ bool CXXRecordDecl::isInterfaceLike() co
>
> // Check "Special" types.
> const auto *Uuid = getAttr<UuidAttr>();
> - if (Uuid && isStruct() && getDeclContext()->isTranslationUnit() &&
> + if (Uuid && isStruct() && (getDeclContext()->isTranslationUnit() ||
> + getDeclContext()->isExternCXXContext())
> + &&
Do you need to check that the "extern C++" is actually a direct child of the translation unit? Consider, e.g. `namespace X { extern "C++"`...
-Eli
--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
More information about the cfe-commits
mailing list