jansvoboda11 updated this revision to Diff 337155. jansvoboda11 added a comment.
Remove copy-assignment changes Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D99568/new/ https://reviews.llvm.org/D99568 Files: clang/include/clang/Frontend/CompilerInvocation.h clang/lib/Frontend/CompilerInvocation.cpp clang/unittests/Frontend/CompilerInvocationTest.cpp Index: clang/unittests/Frontend/CompilerInvocationTest.cpp =================================================================== --- clang/unittests/Frontend/CompilerInvocationTest.cpp +++ clang/unittests/Frontend/CompilerInvocationTest.cpp @@ -97,6 +97,18 @@ ASSERT_THAT(Array, ContainsN(StrEq("x"), 2)); } +// Copy constructor performs a deep copy of reference-counted pointers. + +TEST(CompilerInvocationTest, DeepCopyConstructor) { + CompilerInvocation A; + A.getAnalyzerOpts()->Config["Key"] = "Old"; + + CompilerInvocation B(A); + B.getAnalyzerOpts()->Config["Key"] = "New"; + + ASSERT_EQ(A.getAnalyzerOpts()->Config["Key"], "Old"); +} + // Boolean option with a keypath that defaults to true. // The only flag with a negative spelling can set the keypath to false. Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -113,14 +113,16 @@ : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()), DiagnosticOpts(new DiagnosticOptions()), HeaderSearchOpts(new HeaderSearchOptions()), - PreprocessorOpts(new PreprocessorOptions()) {} + PreprocessorOpts(new PreprocessorOptions()), + AnalyzerOpts(new AnalyzerOptions()) {} CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X) : LangOpts(new LangOptions(*X.getLangOpts())), TargetOpts(new TargetOptions(X.getTargetOpts())), DiagnosticOpts(new DiagnosticOptions(X.getDiagnosticOpts())), HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())), - PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())) {} + PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())), + AnalyzerOpts(new AnalyzerOptions(*X.getAnalyzerOpts())) {} CompilerInvocationBase::~CompilerInvocationBase() = default; Index: clang/include/clang/Frontend/CompilerInvocation.h =================================================================== --- clang/include/clang/Frontend/CompilerInvocation.h +++ clang/include/clang/Frontend/CompilerInvocation.h @@ -78,6 +78,9 @@ /// Options controlling the preprocessor (aside from \#include handling). std::shared_ptr<PreprocessorOptions> PreprocessorOpts; + /// Options controlling the static analyzer. + AnalyzerOptionsRef AnalyzerOpts; + CompilerInvocationBase(); CompilerInvocationBase(const CompilerInvocationBase &X); CompilerInvocationBase &operator=(const CompilerInvocationBase &) = delete; @@ -110,6 +113,8 @@ const PreprocessorOptions &getPreprocessorOpts() const { return *PreprocessorOpts; } + + AnalyzerOptionsRef getAnalyzerOpts() const { return AnalyzerOpts; } }; /// Helper class for holding the data necessary to invoke the compiler. @@ -118,9 +123,6 @@ /// compiler, including data such as the include paths, the code generation /// options, the warning flags, and so on. class CompilerInvocation : public CompilerInvocationBase { - /// Options controlling the static analyzer. - AnalyzerOptionsRef AnalyzerOpts; - MigratorOptions MigratorOpts; /// Options controlling IRgen and the backend. @@ -139,8 +141,6 @@ PreprocessorOutputOptions PreprocessorOutputOpts; public: - CompilerInvocation() : AnalyzerOpts(new AnalyzerOptions()) {} - /// @name Utility Methods /// @{ @@ -203,8 +203,6 @@ /// @name Option Subgroups /// @{ - AnalyzerOptionsRef getAnalyzerOpts() const { return AnalyzerOpts; } - MigratorOptions &getMigratorOpts() { return MigratorOpts; } const MigratorOptions &getMigratorOpts() const { return MigratorOpts; }
Index: clang/unittests/Frontend/CompilerInvocationTest.cpp =================================================================== --- clang/unittests/Frontend/CompilerInvocationTest.cpp +++ clang/unittests/Frontend/CompilerInvocationTest.cpp @@ -97,6 +97,18 @@ ASSERT_THAT(Array, ContainsN(StrEq("x"), 2)); } +// Copy constructor performs a deep copy of reference-counted pointers. + +TEST(CompilerInvocationTest, DeepCopyConstructor) { + CompilerInvocation A; + A.getAnalyzerOpts()->Config["Key"] = "Old"; + + CompilerInvocation B(A); + B.getAnalyzerOpts()->Config["Key"] = "New"; + + ASSERT_EQ(A.getAnalyzerOpts()->Config["Key"], "Old"); +} + // Boolean option with a keypath that defaults to true. // The only flag with a negative spelling can set the keypath to false. Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -113,14 +113,16 @@ : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()), DiagnosticOpts(new DiagnosticOptions()), HeaderSearchOpts(new HeaderSearchOptions()), - PreprocessorOpts(new PreprocessorOptions()) {} + PreprocessorOpts(new PreprocessorOptions()), + AnalyzerOpts(new AnalyzerOptions()) {} CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X) : LangOpts(new LangOptions(*X.getLangOpts())), TargetOpts(new TargetOptions(X.getTargetOpts())), DiagnosticOpts(new DiagnosticOptions(X.getDiagnosticOpts())), HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())), - PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())) {} + PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())), + AnalyzerOpts(new AnalyzerOptions(*X.getAnalyzerOpts())) {} CompilerInvocationBase::~CompilerInvocationBase() = default; Index: clang/include/clang/Frontend/CompilerInvocation.h =================================================================== --- clang/include/clang/Frontend/CompilerInvocation.h +++ clang/include/clang/Frontend/CompilerInvocation.h @@ -78,6 +78,9 @@ /// Options controlling the preprocessor (aside from \#include handling). std::shared_ptr<PreprocessorOptions> PreprocessorOpts; + /// Options controlling the static analyzer. + AnalyzerOptionsRef AnalyzerOpts; + CompilerInvocationBase(); CompilerInvocationBase(const CompilerInvocationBase &X); CompilerInvocationBase &operator=(const CompilerInvocationBase &) = delete; @@ -110,6 +113,8 @@ const PreprocessorOptions &getPreprocessorOpts() const { return *PreprocessorOpts; } + + AnalyzerOptionsRef getAnalyzerOpts() const { return AnalyzerOpts; } }; /// Helper class for holding the data necessary to invoke the compiler. @@ -118,9 +123,6 @@ /// compiler, including data such as the include paths, the code generation /// options, the warning flags, and so on. class CompilerInvocation : public CompilerInvocationBase { - /// Options controlling the static analyzer. - AnalyzerOptionsRef AnalyzerOpts; - MigratorOptions MigratorOpts; /// Options controlling IRgen and the backend. @@ -139,8 +141,6 @@ PreprocessorOutputOptions PreprocessorOutputOpts; public: - CompilerInvocation() : AnalyzerOpts(new AnalyzerOptions()) {} - /// @name Utility Methods /// @{ @@ -203,8 +203,6 @@ /// @name Option Subgroups /// @{ - AnalyzerOptionsRef getAnalyzerOpts() const { return AnalyzerOpts; } - MigratorOptions &getMigratorOpts() { return MigratorOpts; } const MigratorOptions &getMigratorOpts() const { return MigratorOpts; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits