aaron.ballman accepted this revision.
aaron.ballman added a comment.
This revision is now accepted and ready to land.

LGTM!



================
Comment at: lib/Sema/SemaTemplate.cpp:3055
 
+// Print a diagnostic for the failing static_assert expression. Defaults to
+// pretty-printing the expression.
----------------
courbet wrote:
> aaron.ballman wrote:
> > courbet wrote:
> > > aaron.ballman wrote:
> > > > Comment is a bit out of date as this is no longer specific to 
> > > > `static_assert`.
> > > > 
> > > > It looks like this may also change the behavior of enable_if diagnostic 
> > > > reporting. Do you need to update any of those tests from this change? 
> > > > If not, can you devise some tests for that case as well to show that 
> > > > this isn't just a static_assert behavior? (Do a search for 
> > > > `findFailedBooleanCondition` to find where the behavior has changed.)
> > > Nope, unfortunately the code that calls this is actually untested...
> > > I could not find a test that actually enters the:
> > > ```
> > > if (TypeAliasTemplateDecl *AliasTemplate =
> > >           dyn_cast<TypeAliasTemplateDecl>(Template))
> > > ```
> > > in `Sema::CheckTemplateIdType`.
> > > 
> > > I stopped at the following insanity:
> > > 
> > > ```
> > > // RUN: %clang_cc1 -std=c++11 -verify %s
> > > 
> > > template <typename T, typename U>
> > > struct is_same {
> > >   enum { value = 0 };
> > > };
> > > 
> > > template <typename T> struct is_same<T, T> {
> > >   enum { value = 1 };
> > > };
> > > 
> > > struct Dispatch {
> > >   template <typename T> using SameAs = is_same<int, T>;
> > > };
> > > 
> > > template <typename DispatchT>
> > > struct S {
> > >   template <typename T> using same = typename DispatchT::template 
> > > SameAs<T>;
> > > 
> > >   template <typename T>
> > >   static void foo() __attribute__((enable_if(same<T>::value, "")));
> > > 
> > > };
> > > 
> > > void runFoo() {
> > >   // S<Dispatch>::foo<int>();
> > >   S<FailedDispatch>::foo<float>();
> > > 
> > > }
> > > ```
> > > 
> > > This one exercises the code up to `if (CanonType.isNull()) {`, but I'm 
> > > not sure how to get a null type here.
> > > 
> > How about this:
> > ```
> > namespace boost {
> >   template<bool, typename = void> struct enable_if {};
> >   template<typename T> struct enable_if<true, T> { typedef T type; };
> > }
> > 
> > template<typename T> struct NonTemplateFunction {
> >   typename boost::enable_if<sizeof(T) == 4, int>::type f();
> > };
> > 
> > template <typename T>
> > struct Bobble {
> >   using type = T;
> > };
> > 
> > struct Frobble {
> >   using type = char;
> > };
> > NonTemplateFunction<Bobble<typename Frobble::type>::type> NTFC;
> > ```
> > That should trigger the path in `Sema::CheckTypenameType()`, I believe.
> This triggers:
> ```
> else if (ClassTemplateDecl *ClassTemplate
>                = dyn_cast<ClassTemplateDecl>(Template))
> ```
> 
> Modifying it to:
> ```
> namespace boost {
>   template<bool, typename = void> struct enable_if {};
>   template<typename T> struct enable_if<true, T> { typedef T type; };
> }
> 
> template<typename T> struct NonTemplateFunction {
>   template <typename U> using toto = typename boost::enable_if<sizeof(U) == 
> 4, int>::type;
>   toto<T> f();
> };
> 
> template <typename T>
> struct Bobble {
>   using type = T;
> };
> 
> struct Frobble {
>   using type = char;
> };
> NonTemplateFunction<Bobble<typename Frobble::type>::type> NTFC;
> ```
> 
> triggers the same path as my previous example, but not the `IsNull()` test.
Aw crud, well, we tried.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D54903/new/

https://reviews.llvm.org/D54903



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to