[cfe-commits] r58100 - in /cfe/trunk: lib/Sema/SemaDecl.cpp test/SemaCXX/fntype-decl.cpp
Argiris Kirtzidis
akyrtzi at gmail.com
Fri Oct 24 14:33:01 PDT 2008
Hi Doug,
Two points:
--Would it be better if the C++ semantic checks were modified to work on
the param types of the function type ?
ParmVarDecls are not strictly needed except in the case of default args.
--The test case (along with some others) now crashes on both C++ and C
on Windows. This is what happens:
-ParmVarDecls are added to the FunctionDecl that has typedef as type.
-When it's time to destroy the FunctionDecl, the destructor enters the
ParmVarDecl-destroying-loop
-FunctionDecl::param_end() sees that there are actually ParmVarDecls
stored so it tries to return the correct iterator (before your commit it
would just return 0x0 for a typedef'ed FunctionDecl).
-FunctionDecl::getNumParams() tries to return the number of parameters.
-Getting the param number involves first getting at the underlying
FunctionType of the TypedefType.
-In order to get at its unsugared type, the TypedefType needs to get the
TypedefDecl::UnderlyingType
-The TypedefDecl was previously destroyed and... crash!
-Argiris
Douglas Gregor wrote:
> 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;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list