| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -Wno-unused |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -Wno-unused -fms-compatibility -DMSVC |
| |
| namespace PR8446_1 { |
| struct A { |
| typedef int BASE_VALUE; |
| }; |
| |
| void g(int &y) {} |
| |
| template <typename BASE_CLASS> |
| void f(int &rValue) { |
| #if MSVC |
| // expected-warning@+4 {{missing 'typename' prior to dependent type name 'BASE_CLASS::BASE_VALUE'}} |
| #else |
| // expected-error@+2 {{expected expression}} |
| #endif |
| return g((BASE_CLASS::BASE_VALUE &)rValue); |
| } |
| |
| int main() { |
| int x; |
| f<A>(x); |
| return 0; |
| } |
| } // namespace PR8446_1 |
| |
| |
| namespace PR8446_2 { |
| struct site_symmetry_ops {}; |
| |
| template <class wt> |
| struct class_ { |
| template <class A1> |
| void def(A1 const &a1) {} |
| }; |
| |
| template <class A1, class A2> |
| struct init { |
| init() {} |
| }; |
| |
| struct special_position_site_parameter { |
| typedef char scatterer_type; |
| }; |
| |
| template <class wt> |
| struct valued_asu_parameter_heir_wrapper { |
| static class_<wt> wrap(char const *name) { |
| return class_<wt>(); |
| } |
| }; |
| |
| template <class wt> |
| struct special_position_wrapper { |
| static void wrap(char const *name) { |
| valued_asu_parameter_heir_wrapper<wt>::wrap(name) |
| #if MSVC |
| // expected-warning@+4 {{missing 'typename' prior to dependent type name 'wt::scatterer_type'}} |
| #else |
| // expected-error@+2 {{expected expression}} |
| #endif |
| .def(init<site_symmetry_ops const &, wt::scatterer_type *>()); |
| } |
| }; |
| |
| void wrap_special_position() { |
| special_position_wrapper<special_position_site_parameter>::wrap("special_position_site_parameter"); |
| } |
| } // namespace PR8446_2 |
| |
| namespace PR8446_3 { |
| int g(int); |
| template <typename T> |
| int f1(int x) { |
| return g((T::InnerName & x) & x); |
| } |
| |
| template <typename T> |
| int f2(int x) { |
| return g((T::InnerName & 3) & x); |
| } |
| |
| template <typename T> |
| int f3(int x) { |
| return g((T::InnerName & (3))); |
| } |
| |
| template <typename T> |
| int f4(int x) { |
| return g((T::InnerName * 3) & x); |
| } |
| struct A { |
| static const int InnerName = 42; |
| }; |
| int main() { |
| f1<A>(0); |
| f2<A>(0); |
| f3<A>(0); |
| return f4<A>(0); |
| } |
| } // namespace PR8446_3 |