diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/PR16677.cpp | 16 |
2 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index cdfdc37f5e8..9cd3002dd8d 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -5626,7 +5626,9 @@ bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject( /// having a particular direct or virtual base class. bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) { CXXRecordDecl *BaseClass = Base->getType()->getAsCXXRecordDecl(); - return shouldDeleteForClassSubobject(BaseClass, Base, 0); + // If program is correct, BaseClass cannot be null, but if it is, the error + // must be reported elsewhere. + return BaseClass && shouldDeleteForClassSubobject(BaseClass, Base, 0); } /// Check whether we should delete a special member function due to the class diff --git a/clang/test/SemaCXX/PR16677.cpp b/clang/test/SemaCXX/PR16677.cpp new file mode 100644 index 00000000000..7140ac79f08 --- /dev/null +++ b/clang/test/SemaCXX/PR16677.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s + +class Class_With_Destructor { + ~Class_With_Destructor() { } +}; + +template <class T> +class Base { }; + +template<class T, // Should be angle bracket instead of comma +class Derived : public Base<T> { // expected-error{{'Derived' cannot be defined in a type specifier}} + Class_With_Destructor member; +}; // expected-error{{a non-type template parameter cannot have type 'class Derived'}} + // expected-error@-1{{expected ',' or '>' in template-parameter-list}} + // expected-warning@-2{{declaration does not declare anything}} + |

