aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Frontend/CompilerInvocation.h5
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp17
-rw-r--r--clang/unittests/Frontend/CompilerInvocationTest.cpp13
3 files changed, 32 insertions, 3 deletions
diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h
index bf2fbce..367efc5 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -91,8 +91,9 @@ public:
CompilerInvocationRefBase();
CompilerInvocationRefBase(const CompilerInvocationRefBase &X);
- CompilerInvocationRefBase &
- operator=(const CompilerInvocationRefBase &) = delete;
+ CompilerInvocationRefBase(CompilerInvocationRefBase &&X);
+ CompilerInvocationRefBase &operator=(CompilerInvocationRefBase X);
+ CompilerInvocationRefBase &operator=(CompilerInvocationRefBase &&X);
~CompilerInvocationRefBase();
LangOptions *getLangOpts() { return LangOpts.get(); }
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index fd6ca5e..34319fe 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -125,6 +125,23 @@ CompilerInvocationRefBase::CompilerInvocationRefBase(
PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())),
AnalyzerOpts(new AnalyzerOptions(*X.getAnalyzerOpts())) {}
+CompilerInvocationRefBase::CompilerInvocationRefBase(
+ CompilerInvocationRefBase &&X) = default;
+
+CompilerInvocationRefBase &
+CompilerInvocationRefBase::operator=(CompilerInvocationRefBase X) {
+ LangOpts.swap(X.LangOpts);
+ TargetOpts.swap(X.TargetOpts);
+ DiagnosticOpts.swap(X.DiagnosticOpts);
+ HeaderSearchOpts.swap(X.HeaderSearchOpts);
+ PreprocessorOpts.swap(X.PreprocessorOpts);
+ AnalyzerOpts.swap(X.AnalyzerOpts);
+ return *this;
+}
+
+CompilerInvocationRefBase &
+CompilerInvocationRefBase::operator=(CompilerInvocationRefBase &&X) = default;
+
CompilerInvocationRefBase::~CompilerInvocationRefBase() = default;
//===----------------------------------------------------------------------===//
diff --git a/clang/unittests/Frontend/CompilerInvocationTest.cpp b/clang/unittests/Frontend/CompilerInvocationTest.cpp
index 5062a2e..0baf17f 100644
--- a/clang/unittests/Frontend/CompilerInvocationTest.cpp
+++ b/clang/unittests/Frontend/CompilerInvocationTest.cpp
@@ -97,7 +97,7 @@ TEST(ContainsN, Two) {
ASSERT_THAT(Array, ContainsN(StrEq("x"), 2));
}
-// Copy constructor performs a deep copy of reference-counted pointers.
+// Copy constructor/assignment perform deep copy of reference-counted pointers.
TEST(CompilerInvocationTest, DeepCopyConstructor) {
CompilerInvocation A;
@@ -109,6 +109,17 @@ TEST(CompilerInvocationTest, DeepCopyConstructor) {
ASSERT_EQ(A.getAnalyzerOpts()->Config["Key"], "Old");
}
+TEST(CompilerInvocationTest, DeepCopyAssignment) {
+ CompilerInvocation A;
+ A.getAnalyzerOpts()->Config["Key"] = "Old";
+
+ CompilerInvocation B;
+ 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.