summaryrefslogtreecommitdiff
path: root/test/SemaTemplate/ms-lookup-template-base-classes.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-07-08 21:35:03 +0000
committerReid Kleckner <reid@kleckner.net>2014-07-08 21:35:03 +0000
commit16251bd5aff05d7a08009232b361b49556926708 (patch)
treee68173269f66137e5c9abf7e1d699a14eb21259b /test/SemaTemplate/ms-lookup-template-base-classes.cpp
parente5274ba3457d6c18ecadfb44f1cf8f7e0e689111 (diff)
downloadclang-16251bd5aff05d7a08009232b361b49556926708.tar.gz
MS compat: Allow lookup of types from dependent bases in functions
If we want to resolve the remaining FIXMEs here, we probably want to extend the main lookup mechanism to perform lookup into dependent bases, but we would have to tread lightly. Adding more name lookup has major impact on compile time. If we did extend the main mechanism, we would add a flag to LookupResult that allows us to find names from dependent base classes where the base is a specialization of a known template. The final LookupResult would still return LookupResult::NotFoundInCurrentInstantiation, but it would have a collection of Decls. If we find a real lookup result, we would clear the flag and the existing lookup results and begin accumulating only real lookup results. We would structure the lookup as a secondary lookup between normal lookup and typo correction for normal compilation, but for MSVC compatibility mode, we would always enable this extra lookup into dependent bases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@212566 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaTemplate/ms-lookup-template-base-classes.cpp')
-rw-r--r--test/SemaTemplate/ms-lookup-template-base-classes.cpp28
1 files changed, 16 insertions, 12 deletions
diff --git a/test/SemaTemplate/ms-lookup-template-base-classes.cpp b/test/SemaTemplate/ms-lookup-template-base-classes.cpp
index 635f0b0cd0..40f73c0d9e 100644
--- a/test/SemaTemplate/ms-lookup-template-base-classes.cpp
+++ b/test/SemaTemplate/ms-lookup-template-base-classes.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -std=c++1y -fms-compatibility -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++1y -fms-compatibility -fno-spell-checking -fsyntax-only -verify %s
template <class T>
@@ -380,6 +380,15 @@ struct B : A<T> { NameFromBase m; }; // expected-error {{unknown type name 'Name
struct C : A<int> { NameFromBase m; }; // expected-error {{unknown type name 'NameFromBase'}}
}
+namespace type_in_base_of_dependent_base {
+struct A { typedef int NameFromBase; };
+template <typename T>
+struct B : A {};
+// FIXME: MSVC accepts this.
+template <typename T>
+struct C : B<T> { NameFromBase m; }; // expected-error {{unknown type name 'NameFromBase'}}
+}
+
namespace lookup_in_function_contexts {
template <typename T> struct A { typedef T NameFromBase; };
template <typename T>
@@ -389,23 +398,20 @@ struct B : A<T> {
return {};
}
- // FIXME: MSVC accepts all of the code below that isn't C++14 only. Downgrade
- // these errors to warnings.
-
static void memberFunc() {
- NameFromBase x; // expected-error {{unknown type name 'NameFromBase'}}
+ NameFromBase x; // expected-warning {{lookup into dependent bases}}
}
static void funcLocalClass() {
struct X {
- NameFromBase x; // expected-error {{unknown type name 'NameFromBase'}}
+ NameFromBase x; // expected-warning {{lookup into dependent bases}}
} y;
}
void localClassMethod() {
struct X {
void bar() {
- NameFromBase m; // expected-error {{unknown type name 'NameFromBase'}}
+ NameFromBase m; // expected-warning {{lookup into dependent bases}}
}
} x;
x.bar();
@@ -413,20 +419,18 @@ struct B : A<T> {
static void funcLambda() {
auto l = []() {
- NameFromBase x; // expected-error {{unknown type name 'NameFromBase'}}
+ NameFromBase x; // expected-warning {{lookup into dependent bases}}
};
l();
}
static constexpr int constexprFunc() {
- NameFromBase x = {}; // expected-error {{unknown type name 'NameFromBase'}}
- // FIXME: Suppress this diagnostic, we have an initializer.
- // expected-error@-2 {{variables defined in a constexpr function must be initialized}}
+ NameFromBase x = {}; // expected-warning {{lookup into dependent bases}}
return sizeof(x);
}
static auto autoFunc() {
- NameFromBase x; // expected-error {{unknown type name 'NameFromBase'}}
+ NameFromBase x; // expected-warning {{lookup into dependent bases}}
return x;
}
};