]> granicus.if.org Git - clang/commitdiff
More diagnostics related to initialization of direct bases
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 30 Jun 2009 17:34:52 +0000 (17:34 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 30 Jun 2009 17:34:52 +0000 (17:34 +0000)
in ctor-initializer list.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/constructor-initializer.cpp

index 8a532d62a71e0e71b53f6fcadd0aaa2112ed1162..5847945a4f8e1683b748950ee9acf02866d9de24 100644 (file)
@@ -1604,6 +1604,8 @@ def err_base_init_does_not_name_class : Error<
 def err_base_init_direct_and_virtual : Error<
   "base class initializer %0 names both a direct base class and an "
   "inherited virtual base class">;
+def err_not_direct_base_or_virtual : Error<
+  "type %0 is not a direct or virtual base of '%1'">;
 
 def err_in_class_initializer_non_integral_type : Error<
   "in-class initializer has non-integral, non-enumeration type %0">;
index 77823c3b820e2e2425aaceea1017e8bf66ec44f9..546c783a623703e0e6b88f73e08b1d7abda982db 100644 (file)
@@ -750,6 +750,15 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,
   if (DirectBaseSpec && VirtualBaseSpec)
     return Diag(IdLoc, diag::err_base_init_direct_and_virtual)
       << MemberOrBase << SourceRange(IdLoc, RParenLoc);
+  // C++ [base.class.init]p2:
+  // Unless the mem-initializer-id names a nonstatic data membeer of the
+  // constructor's class ot a direst or virtual base of that class, the
+  // mem-initializer is ill-formed.
+  if (!DirectBaseSpec && !VirtualBaseSpec)
+    return Diag(IdLoc, diag::err_not_direct_base_or_virtual)
+    << BaseType << ClassDecl->getNameAsCString()
+    << SourceRange(IdLoc, RParenLoc);
+    
 
   return new CXXBaseOrMemberInitializer(BaseType, (Expr **)Args, NumArgs, 
                                         IdLoc);
index d0c978a80d15d52f4c9cfa58d5b0f346a2f197a3..d8b95cec4cd9789d0e8e2d3e5fe05e171c6b1170 100644 (file)
@@ -54,3 +54,15 @@ class H : A {
 
 H::H() : A(10) { }
 
+
+class  X {};
+class Y {};
+
+struct S : Y, virtual X {
+  S (); 
+};
+
+struct Z : S { 
+  Z() : S(), X(), E()  {} // expected-error {{type 'class E' is not a direct or virtual base of 'Z'}}
+};
+