]> granicus.if.org Git - clang/commitdiff
Fix RecursiveASTVisitor to traverse the ctor initializer list before
authorZhanyong Wan <wan@google.com>
Wed, 30 Jun 2010 18:34:52 +0000 (18:34 +0000)
committerZhanyong Wan <wan@google.com>
Wed, 30 Jun 2010 18:34:52 +0000 (18:34 +0000)
traversing the ctor body when traversing a CXXConstructorDecl.
Reviewed by chandlerc and csilvers.

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

include/clang/AST/RecursiveASTVisitor.h

index 5192ce3607c532ad850937fa767445596d94fbf8..3248a40eaa061cf614c24f20907014c9bf486f94 100644 (file)
@@ -992,6 +992,16 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
 
   TRY_TO(TraverseType(D->getResultType()));
   TRY_TO(TraverseDeclContextHelper(D));  // Parameters.
+
+  if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
+    // Constructor initializers.
+    for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(),
+                                           E = Ctor->init_end();
+         I != E; ++I) {
+      TRY_TO(TraverseConstructorInitializer(*I));
+    }
+  }
+
   if (D->isThisDeclarationADefinition()) {
     TRY_TO(TraverseStmt(D->getBody()));  // Function body.
   }
@@ -1011,18 +1021,9 @@ DEF_TRAVERSE_DECL(CXXMethodDecl, {
   })
 
 DEF_TRAVERSE_DECL(CXXConstructorDecl, {
-    TRY_TO(TraverseFunctionHelper(D));
-    // FIXME: traverse the initializers before traversing the
-    // constructor body.
-    for (CXXConstructorDecl::init_iterator I = D->init_begin(),
-                                           E = D->init_end();
-         I != E; ++I) {
-      TRY_TO(TraverseConstructorInitializer(*I));
-    }
-
     // We skip decls_begin/decls_end, which are already covered by
     // TraverseFunctionHelper().
-    return true;
+    return TraverseFunctionHelper(D);
   })
 
 // CXXConversionDecl is the declaration of a type conversion operator.