[cfe-commits] r58100 - in /cfe/trunk: lib/Sema/SemaDecl.cpp test/SemaCXX/fntype-decl.cpp

Douglas Gregor doug.gregor at gmail.com
Fri Oct 24 11:09:55 PDT 2008


Author: dgregor
Date: Fri Oct 24 13:09:54 2008
New Revision: 58100

URL: http://llvm.org/viewvc/llvm-project?rev=58100&view=rev
Log:
PR2942: FunctionDecls by typedef crash the C++ front-end

Added:
    cfe/trunk/test/SemaCXX/fntype-decl.cpp
Modified:
    cfe/trunk/lib/Sema/SemaDecl.cpp

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=58100&r1=58099&r2=58100&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Oct 24 13:09:54 2008
@@ -781,13 +781,42 @@
             Param->getType().getUnqualifiedType() != Context.VoidTy) {
           Diag(Param->getLocation(), diag::ext_param_typedef_of_void);
         }
-
       } else if (FTI.NumArgs > 0 && FTI.ArgInfo[0].Param != 0) {
         for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i)
           Params.push_back((ParmVarDecl *)FTI.ArgInfo[i].Param);
       }
   
       NewFD->setParams(&Params[0], Params.size());
+    } else if (R->getAsTypedefType()) {
+      // When we're declaring a function with a typedef, as in the
+      // following example, we'll need to synthesize (unnamed)
+      // parameters for use in the declaration.
+      //
+      // @code
+      // typedef void fn(int);
+      // fn f;
+      // @endcode
+      const FunctionTypeProto *FT = R->getAsFunctionTypeProto();
+      if (!FT) {
+        // This is a typedef of a function with no prototype, so we
+        // don't need to do anything.
+      } else if ((FT->getNumArgs() == 0) ||
+          (FT->getNumArgs() == 1 && !FT->isVariadic() &&
+           FT->getArgType(0)->isVoidType())) {
+        // This is a zero-argument function. We don't need to do anything.
+      } else {
+        // Synthesize a parameter for each argument type.
+        llvm::SmallVector<ParmVarDecl*, 16> Params;
+        for (FunctionTypeProto::arg_type_iterator ArgType = FT->arg_type_begin();
+             ArgType != FT->arg_type_end(); ++ArgType) {
+          Params.push_back(ParmVarDecl::Create(Context, CurContext,
+                                               SourceLocation(), 0,
+                                               *ArgType, VarDecl::None,
+                                               0, 0));
+        }
+
+        NewFD->setParams(&Params[0], Params.size());
+      }
     }
 
     // Merge the decl with the existing one if appropriate. Since C functions

Added: cfe/trunk/test/SemaCXX/fntype-decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/fntype-decl.cpp?rev=58100&view=auto

==============================================================================
--- cfe/trunk/test/SemaCXX/fntype-decl.cpp (added)
+++ cfe/trunk/test/SemaCXX/fntype-decl.cpp Fri Oct 24 13:09:54 2008
@@ -0,0 +1,5 @@
+// RUN: clang -fsyntax-only -verify %s
+
+// PR2942
+typedef void fn(int);
+fn f;





More information about the cfe-commits mailing list