r314235 - Allow IUnknown/IInterface types to come from extern C++

Friedman, Eli via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 26 12:05:42 PDT 2017


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