]> granicus.if.org Git - clang/commitdiff
Handle typedef function declarations correctly, such as
authorCraig Silverstein <csilvers2000@yahoo.com>
Thu, 1 Jul 2010 23:46:26 +0000 (23:46 +0000)
committerCraig Silverstein <csilvers2000@yahoo.com>
Thu, 1 Jul 2010 23:46:26 +0000 (23:46 +0000)
       typedef int (*Myfunc)(int);
       Myfunc func;

Reviewed by chandlerc

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

include/clang/AST/RecursiveASTVisitor.h

index 3248a40eaa061cf614c24f20907014c9bf486f94..d593be81f9f6079613d91cd0abc785dbd1d08afd 100644 (file)
@@ -977,17 +977,23 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
   TRY_TO(TraverseNestedNameSpecifier(D->getQualifier()));
 
   // Visit the function type itself, which can be either
-  // FunctionNoProtoType or FunctionProtoType.
+  // FunctionNoProtoType or FunctionProtoType, or a typedef.  If it's
+  // not a Function*ProtoType, then it can't have a body or arguments,
+  // so we have to do less work.
   Type *FuncType = D->getType().getTypePtr();
-  if (FunctionNoProtoType *FuncNoProto =
+  if (FunctionProtoType *FuncProto = dyn_cast<FunctionProtoType>(FuncType)) {
+    // Don't call Traverse*, or the result type and parameter types
+    // will be double counted.
+    TRY_TO(WalkUpFromFunctionProtoType(FuncProto));
+  } else if (FunctionNoProtoType *FuncNoProto =
       dyn_cast<FunctionNoProtoType>(FuncType)) {
     // Don't call Traverse*, or the result type will be double
     // counted.
     TRY_TO(WalkUpFromFunctionNoProtoType(FuncNoProto));
-  } else {
-    // Don't call Traverse*, or the result type and parameter types
-    // will be double counted.
-    TRY_TO(WalkUpFromFunctionProtoType(dyn_cast<FunctionProtoType>(FuncType)));
+  } else {   // a typedef type, or who knows what
+    TRY_TO(TraverseType(D->getType()));
+    assert(!D->isThisDeclarationADefinition() && "Unexpected function type");
+    return true;
   }
 
   TRY_TO(TraverseType(D->getResultType()));