p1.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11
  2. // base-clause:
  3. // : base-specifier-list
  4. // base-specifier-list:
  5. // base-specifier ...[opt]
  6. // base-specifier-list , base-specifier ...[opt]
  7. // base-specifier:
  8. // attribute-specifier-seq[opt] base-type-specifier
  9. // attribute-specifier-seq[opt] virtual access-specifier[opt] base-type-specifier
  10. // attribute-specifier-seq[opt] access-specifier virtual[opt] base-type-specifier
  11. // class-or-decltype:
  12. // nested-name-specifier[opt] class-name
  13. // decltype-specifier
  14. // base-type-specifier:
  15. // class-or-decltype
  16. // access-specifier:
  17. // private
  18. // protected
  19. // public
  20. namespace PR11216 {
  21. struct Base { };
  22. struct Derived : decltype(Base()) { };
  23. int func();
  24. struct Derived2 : decltype(func()) { }; // expected-error {{base specifier must name a class}}
  25. template<typename T>
  26. struct Derived3 : decltype(T().foo()) { };
  27. struct Foo { Base foo(); };
  28. Derived3<Foo> d;
  29. struct Derived4 : :: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}}
  30. struct Derived5 : PR11216:: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}}
  31. template<typename T>
  32. struct Derived6 : typename T::foo { }; // expected-error {{'typename' is redundant; base classes are implicitly types}}
  33. }