summaryrefslogtreecommitdiffstats
path: root/test/SemaTemplate/missing-typename.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaTemplate/missing-typename.cpp')
-rw-r--r--test/SemaTemplate/missing-typename.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/test/SemaTemplate/missing-typename.cpp b/test/SemaTemplate/missing-typename.cpp
new file mode 100644
index 0000000000..3f8282dcaf
--- /dev/null
+++ b/test/SemaTemplate/missing-typename.cpp
@@ -0,0 +1,102 @@
+// 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