[cfe-dev] Default arguments considered harmful?

David Tweed david.tweed at arm.com
Fri May 2 01:16:59 PDT 2014


I wonder if, with C++11 named initialization syntax for PODs, something
could be done so that in cases like this a (function specific, I guess)
"optional options object" could be used. (This would avoid one of the big
problems with C++ optional arguments, which is that if one towards the end
needs to be set to a non-default value all the preceding options need
setting.) That would certainly make things a lot easier to read in cases
like these.

-----Original Message-----
From: cfe-commits-bounces at cs.uiuc.edu
[mailto:cfe-commits-bounces at cs.uiuc.edu] On Behalf Of Alp Toker
Sent: 02 May 2014 04:58
To: cfe-commits at cs.uiuc.edu; clang-dev Developers
Subject: Default arguments considered harmful?

This got me thinking, perhaps it's time to introduce coding style policy 
to discourage excessive use of default arguments?

Check out this gem from ASTUnit.h:

   static ASTUnit *LoadFromCommandLine(
       const char **ArgBegin, const char **ArgEnd,
       IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef 
ResourceFilesPath,
       bool OnlyLocalDecls = false, bool CaptureDiagnostics = false,
       ArrayRef<RemappedFile> RemappedFiles = None,
       bool RemappedFilesKeepOriginalName = true,
       bool PrecompilePreamble = false, TranslationUnitKind TUKind = 
TU_Complete,
       bool CacheCodeCompletionResults = false,
       bool IncludeBriefCommentsInCodeCompletion = false,
       bool AllowPCHWithCompilerErrors = false, bool SkipFunctionBodies 
= false,
       bool UserFilesAreVolatile = false, bool ForSerialization = false,
       std::unique_ptr<ASTUnit> *ErrAST = 0);


Alp.


On 02/05/2014 04:43, Alp Toker wrote:
> Author: alp
> Date: Thu May  1 22:43:30 2014
> New Revision: 207825
>
> URL: http://llvm.org/viewvc/llvm-project?rev=207825&view=rev
> Log:
> Factor TargetInfo pointer/DelayInitialization bool pair out of
Preprocessor ctor
>
> The Preprocessor::Initialize() function already offers a clear interface
to
> achieve this, further reducing the confusing number of states a newly
> constructed preprocessor can have.
>
> Modified:
>      cfe/trunk/include/clang/Lex/Preprocessor.h
>      cfe/trunk/lib/Frontend/ASTUnit.cpp
>      cfe/trunk/lib/Frontend/CompilerInstance.cpp
>      cfe/trunk/lib/Lex/Preprocessor.cpp
>      cfe/trunk/unittests/Basic/SourceManagerTest.cpp
>      cfe/trunk/unittests/Lex/LexerTest.cpp
>      cfe/trunk/unittests/Lex/PPCallbacksTest.cpp
>      cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp
>
> Modified: cfe/trunk/include/clang/Lex/Preprocessor.h
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor
.h?rev=207825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/include/clang/Lex/Preprocessor.h (original)
> +++ cfe/trunk/include/clang/Lex/Preprocessor.h Thu May  1 22:43:30 2014
> @@ -455,12 +455,10 @@ private:  // Cached tokens state.
>   public:
>     Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
>                  DiagnosticsEngine &diags, LangOptions &opts,
> -               const TargetInfo *target,
>                  SourceManager &SM, HeaderSearch &Headers,
>                  ModuleLoader &TheModuleLoader,
>                  IdentifierInfoLookup *IILookup = 0,
>                  bool OwnsHeaderSearch = false,
> -               bool DelayInitialization = false,
>                  TranslationUnitKind TUKind = TU_Complete);
>   
>     ~Preprocessor();
>
> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=2
07825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Thu May  1 22:43:30 2014
> @@ -718,11 +718,10 @@ ASTUnit *ASTUnit::LoadFromASTFile(const
>   
>     AST->PP = new Preprocessor(PPOpts,
>                                AST->getDiagnostics(),
AST->ASTFileLangOpts,
> -                             /*Target=*/0, AST->getSourceManager(),
HeaderInfo,
> +                             AST->getSourceManager(), HeaderInfo,
>                                *AST,
>                                /*IILookup=*/0,
> -                             /*OwnsHeaderSearch=*/false,
> -                             /*DelayInitialization=*/true);
> +                             /*OwnsHeaderSearch=*/false);
>     Preprocessor &PP = *AST->PP;
>   
>     AST->Ctx = new ASTContext(AST->ASTFileLangOpts,
>
> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.
cpp?rev=207825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Thu May  1 22:43:30 2014
> @@ -240,11 +240,11 @@ void CompilerInstance::createPreprocesso
>                                                 getLangOpts(),
>                                                 &getTarget());
>     PP = new Preprocessor(&getPreprocessorOpts(),
> -                        getDiagnostics(), getLangOpts(), &getTarget(),
> +                        getDiagnostics(), getLangOpts(),
>                           getSourceManager(), *HeaderInfo, *this, PTHMgr,
>                           /*OwnsHeaderSearch=*/true,
> -                        /*DelayInitialization=*/false,
>                           TUKind);
> +  PP->Initialize(getTarget());
>   
>     // Note that this is different then passing PTHMgr to Preprocessor's
ctor.
>     // That argument is used as the IdentifierInfoLookup argument to
>
> Modified: cfe/trunk/lib/Lex/Preprocessor.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=2
07825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/lib/Lex/Preprocessor.cpp (original)
> +++ cfe/trunk/lib/Lex/Preprocessor.cpp Thu May  1 22:43:30 2014
> @@ -56,11 +56,11 @@ ExternalPreprocessorSource::~ExternalPre
>   
>   Preprocessor::Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions>
PPOpts,
>                              DiagnosticsEngine &diags, LangOptions &opts,
> -                           const TargetInfo *target, SourceManager &SM,
> +                           SourceManager &SM,
>                              HeaderSearch &Headers, ModuleLoader
&TheModuleLoader,
>                              IdentifierInfoLookup *IILookup, bool
OwnsHeaders,
> -                           bool DelayInitialization, TranslationUnitKind
TUKind)
> -    : PPOpts(PPOpts), Diags(&diags), LangOpts(opts), Target(target),
> +                           TranslationUnitKind TUKind)
> +    : PPOpts(PPOpts), Diags(&diags), LangOpts(opts), Target(0),
>         FileMgr(Headers.getFileMgr()), SourceMgr(SM), HeaderInfo(Headers),
>         TheModuleLoader(TheModuleLoader), ExternalSource(0),
>         Identifiers(opts, IILookup), IncrementalProcessing(false),
> @@ -132,11 +132,6 @@ Preprocessor::Preprocessor(IntrusiveRefC
>       Ident___exception_info = Ident___exception_code =
Ident___abnormal_termination = 0;
>       Ident_GetExceptionInfo = Ident_GetExceptionCode =
Ident_AbnormalTermination = 0;
>     }
> -
> -  if (!DelayInitialization) {
> -    assert(Target && "Must provide target information for PP
initialization");
> -    Initialize(*Target);
> -  }
>   }
>   
>   Preprocessor::~Preprocessor() {
>
> Modified: cfe/trunk/unittests/Basic/SourceManagerTest.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Basic/SourceManagerT
est.cpp?rev=207825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/unittests/Basic/SourceManagerTest.cpp (original)
> +++ cfe/trunk/unittests/Basic/SourceManagerTest.cpp Thu May  1 22:43:30
2014
> @@ -80,11 +80,11 @@ TEST_F(SourceManagerTest, isBeforeInTran
>     VoidModuleLoader ModLoader;
>     HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags,
LangOpts,
>                             &*Target);
> -  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
Target.getPtr(),
> +  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
>                     SourceMgr, HeaderInfo, ModLoader,
>                     /*IILookup =*/ 0,
> -                  /*OwnsHeaderSearch =*/false,
> -                  /*DelayInitialization =*/ false);
> +                  /*OwnsHeaderSearch =*/false);
> +  PP.Initialize(*Target);
>     PP.EnterMainSourceFile();
>   
>     std::vector<Token> toks;
> @@ -195,11 +195,11 @@ TEST_F(SourceManagerTest, getMacroArgExp
>     VoidModuleLoader ModLoader;
>     HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags,
LangOpts,
>                             &*Target);
> -  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
Target.getPtr(),
> +  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
>                     SourceMgr, HeaderInfo, ModLoader,
>                     /*IILookup =*/ 0,
> -                  /*OwnsHeaderSearch =*/false,
> -                  /*DelayInitialization =*/ false);
> +                  /*OwnsHeaderSearch =*/false);
> +  PP.Initialize(*Target);
>     PP.EnterMainSourceFile();
>   
>     std::vector<Token> toks;
> @@ -293,11 +293,11 @@ TEST_F(SourceManagerTest, isBeforeInTran
>     VoidModuleLoader ModLoader;
>     HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags,
LangOpts,
>                             &*Target);
> -  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
Target.getPtr(),
> +  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
>                     SourceMgr, HeaderInfo, ModLoader,
>                     /*IILookup =*/ 0,
> -                  /*OwnsHeaderSearch =*/false,
> -                  /*DelayInitialization =*/ false);
> +                  /*OwnsHeaderSearch =*/false);
> +  PP.Initialize(*Target);
>   
>     std::vector<MacroAction> Macros;
>     PP.addPPCallbacks(new MacroTracker(Macros));
>
> Modified: cfe/trunk/unittests/Lex/LexerTest.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/LexerTest.cpp?re
v=207825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/unittests/Lex/LexerTest.cpp (original)
> +++ cfe/trunk/unittests/Lex/LexerTest.cpp Thu May  1 22:43:30 2014
> @@ -69,10 +69,10 @@ protected:
>       VoidModuleLoader ModLoader;
>       HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags,
LangOpts,
>                               Target.getPtr());
> -    Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
Target.getPtr(),
> +    Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
>                       SourceMgr, HeaderInfo, ModLoader, /*IILookup =*/ 0,
> -                    /*OwnsHeaderSearch =*/ false,
> -                    /*DelayInitialization =*/ false);
> +                    /*OwnsHeaderSearch =*/ false);
> +    PP.Initialize(*Target);
>       PP.EnterMainSourceFile();
>   
>       std::vector<Token> toks;
>
> Modified: cfe/trunk/unittests/Lex/PPCallbacksTest.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/PPCallbacksTest.
cpp?rev=207825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/unittests/Lex/PPCallbacksTest.cpp (original)
> +++ cfe/trunk/unittests/Lex/PPCallbacksTest.cpp Thu May  1 22:43:30 2014
> @@ -173,11 +173,10 @@ protected:
>   
>       IntrusiveRefCntPtr<PreprocessorOptions> PPOpts = new
PreprocessorOptions();
>       Preprocessor PP(PPOpts, Diags, LangOpts,
> -      Target.getPtr(),
>         SourceMgr, HeaderInfo, ModLoader,
>         /*IILookup =*/ 0,
> -      /*OwnsHeaderSearch =*/false,
> -      /*DelayInitialization =*/ false);
> +      /*OwnsHeaderSearch =*/false);
> +    PP.Initialize(*Target);
>       InclusionDirectiveCallbacks* Callbacks = new
InclusionDirectiveCallbacks;
>       PP.addPPCallbacks(Callbacks); // Takes ownership.
>   
> @@ -208,11 +207,10 @@ protected:
>                               OpenCLLangOpts, Target.getPtr());
>   
>       Preprocessor PP(new PreprocessorOptions(), Diags, OpenCLLangOpts,
> -                    Target.getPtr(),
>                       SourceMgr, HeaderInfo, ModLoader,
>                      /*IILookup =*/ 0,
> -                    /*OwnsHeaderSearch =*/false,
> -                    /*DelayInitialization =*/ false);
> +                    /*OwnsHeaderSearch =*/false);
> +    PP.Initialize(*Target);
>   
>       // parser actually sets correct pragma handlers for preprocessor
>       // according to LangOptions, so we init Parser to register opencl
>
> Modified: cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/PPConditionalDir
ectiveRecordTest.cpp?rev=207825&r1=207824&r2=207825&view=diff
>
============================================================================
==
> --- cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp
(original)
> +++ cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp Thu May
1 22:43:30 2014
> @@ -97,11 +97,11 @@ TEST_F(PPConditionalDirectiveRecordTest,
>     VoidModuleLoader ModLoader;
>     HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags,
LangOpts,
>                             Target.getPtr());
> -  Preprocessor PP(new PreprocessorOptions(), Diags,
LangOpts,Target.getPtr(),
> +  Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts,
>                     SourceMgr, HeaderInfo, ModLoader,
>                     /*IILookup =*/ 0,
> -                  /*OwnsHeaderSearch =*/false,
> -                  /*DelayInitialization =*/ false);
> +                  /*OwnsHeaderSearch =*/false);
> +  PP.Initialize(*Target);
>     PPConditionalDirectiveRecord *
>       PPRec = new PPConditionalDirectiveRecord(SourceMgr);
>     PP.addPPCallbacks(PPRec);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-- 
http://www.nuanti.com
the browser experts

_______________________________________________
cfe-commits mailing list
cfe-commits at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits








More information about the cfe-dev mailing list