r256535 - Revert "[TrailingObjects] Use a different technique to determine if a getDecl"

Gabriel Dos Reis via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 28 21:26:58 PST 2015


James, if this wasn't already done, please file a bug against MSVC so this
can be fixed in future releases.

On Mon, Dec 28, 2015 at 8:46 PM, James Y Knight via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: jyknight
> Date: Mon Dec 28 22:46:43 2015
> New Revision: 256535
>
> URL: http://llvm.org/viewvc/llvm-project?rev=256535&view=rev
> Log:
> Revert "[TrailingObjects] Use a different technique to determine if a
> getDecl"
>
> This reverts commit r256534.
>
> Failed to build on MSVC with error:
> clang/ASTMatchers/ASTMatchersInternal.h(572): error C2228: left of
> '.getDecl' must have class/struct/union
>         type is 'add_rvalue_reference<_Ty>::type'
>
> (
> http://lab.llvm.org:8011/builders/lldb-x86-win7-msvc/builds/13873/steps/build/logs/stdio
> )
>
> Modified:
>     cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
>
> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=256535&r1=256534&r2=256535&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h (original)
> +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Mon Dec 28
> 22:46:43 2015
> @@ -558,19 +558,22 @@ bool matchesFirstInPointerRange(const Ma
>    return false;
>  }
>
> -/// Metafunction to determine if type T has a member called
> -/// getDecl.
> -///
> -/// There is a default template inheriting from "false_type". Then, a
> -/// partial specialization inherits from "true_type". However, this
> -/// specialization will only exist when the call to getDecl() isn't an
> -/// error -- it vanishes by SFINAE when the member doesn't exist.
> -template <typename> struct type_sink_to_void { typedef void type; };
> -template <typename T, typename = void> struct has_getDecl :
> std::false_type {};
> -template <typename T>
> -struct has_getDecl<
> -    T, typename
> type_sink_to_void<decltype(std::declval<T>().getDecl())>::type>
> -    : std::true_type {};
> +/// \brief Metafunction to determine if type T has a member called
> getDecl.
> +template <typename T> struct has_getDecl {
> +  struct Default { int getDecl; };
> +  struct Derived : T, Default { };
> +
> +  template<typename C, C> struct CheckT;
> +
> +  // If T::getDecl exists, an ambiguity arises and CheckT will
> +  // not be instantiable. This makes f(...) the only available
> +  // overload.
> +  template<typename C>
> +  static char (&f(CheckT<int Default::*, &C::getDecl>*))[1];
> +  template<typename C> static char (&f(...))[2];
> +
> +  static bool const value = sizeof(f<Derived>(nullptr)) == 2;
> +};
>
>  /// \brief Matches overloaded operators with a specific name.
>  ///
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151228/36061065/attachment.html>


More information about the cfe-commits mailing list