diff options
author | Reid Kleckner <rnk@google.com> | 2015-09-30 17:30:48 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2015-09-30 17:30:48 +0000 |
commit | 21525e7fd4f45b6cfd6d68dbbf10e2cb8d7ebbf0 (patch) | |
tree | 877edf3ae80f342e1875fe9e77aee6ad92707e83 /clang/test/SemaTemplate/recovery-crash.cpp | |
parent | 4c457758805e5090a842509e19860b08e024ed07 (diff) | |
download | bcm5719-llvm-21525e7fd4f45b6cfd6d68dbbf10e2cb8d7ebbf0.tar.gz bcm5719-llvm-21525e7fd4f45b6cfd6d68dbbf10e2cb8d7ebbf0.zip |
[Sema] Avoid crashing during this-> insertion recovery
We get into this bad state when someone defines a new member function
for a class but forgets to add the declaration to the class body.
Calling the new member function from a member function template of the
class will crash during instantiation.
llvm-svn: 248925
Diffstat (limited to 'clang/test/SemaTemplate/recovery-crash.cpp')
-rw-r--r-- | clang/test/SemaTemplate/recovery-crash.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/test/SemaTemplate/recovery-crash.cpp b/clang/test/SemaTemplate/recovery-crash.cpp index 78f6db40d5c..02f80495bb9 100644 --- a/clang/test/SemaTemplate/recovery-crash.cpp +++ b/clang/test/SemaTemplate/recovery-crash.cpp @@ -35,3 +35,25 @@ namespace PR16225 { g<S>(0); // expected-note {{in instantiation of function template specialization}} } } + +namespace test1 { + template <typename> class ArraySlice {}; + class Foo; + class NonTemplateClass { + void MemberFunction(ArraySlice<Foo>, int); + template <class T> void MemberFuncTemplate(ArraySlice<T>, int); + }; + void NonTemplateClass::MemberFunction(ArraySlice<Foo> resource_data, + int now) { + // expected-note@+1 {{in instantiation of function template specialization 'test1::NonTemplateClass::MemberFuncTemplate<test1::Foo>'}} + MemberFuncTemplate(resource_data, now); + } + template <class T> + void NonTemplateClass::MemberFuncTemplate(ArraySlice<T> resource_data, int) { + // expected-error@+1 {{use of undeclared identifier 'UndeclaredMethod'}} + UndeclaredMethod(resource_data); + } + // expected-error@+2 {{out-of-line definition of 'UndeclaredMethod' does not match any declaration}} + // expected-note@+1 {{must qualify identifier to find this declaration in dependent base class}} + void NonTemplateClass::UndeclaredMethod() {} +} |