]> granicus.if.org Git - clang/commitdiff
Do not crash if class is defined in wrong scope.
authorSerge Pavlov <sepavloff@gmail.com>
Mon, 28 Dec 2015 19:40:14 +0000 (19:40 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Mon, 28 Dec 2015 19:40:14 +0000 (19:40 +0000)
This patch fixes PR16677. The latter represents the case when due to
misprinted character class definition occurs in the scope of template
arguments. Base class of this class depends on the template parameter in the
same scope and cannot be resolved, it causes crash. Right behavior is to
make semantic processing even if the definition is wrong, as the code
that emits appropriate message is called after the processing.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@256511 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/PR16677.cpp [new file with mode: 0644]

index cdfdc37f5e8abdb629eb35d521dad8e01d6d16cc..9cd3002dd8df27be47e93abed4db4e67352a19e1 100644 (file)
@@ -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/test/SemaCXX/PR16677.cpp b/test/SemaCXX/PR16677.cpp
new file mode 100644 (file)
index 0000000..7140ac7
--- /dev/null
@@ -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}}
+