diff --git a/src/dawn/native/CompilationMessages.cpp b/src/dawn/native/CompilationMessages.cpp
index e4e1f1b..9d75e26 100644
--- a/src/dawn/native/CompilationMessages.cpp
+++ b/src/dawn/native/CompilationMessages.cpp
@@ -90,24 +90,23 @@
 
 OwnedCompilationMessages::~OwnedCompilationMessages() = default;
 
-void OwnedCompilationMessages::AddMessage(std::string message,
-                                          wgpu::CompilationMessageType type,
-                                          uint64_t lineNum,
-                                          uint64_t linePos,
-                                          uint64_t offset,
-                                          uint64_t length) {
-    // Cannot add messages after GetCompilationInfo has been called.
-    DAWN_ASSERT(mCompilationInfo.messages == nullptr);
+void OwnedCompilationMessages::AddUnanchoredMessage(std::string message,
+                                                    wgpu::CompilationMessageType type) {
+    AddMessage(message, {nullptr, nullptr, static_cast<WGPUCompilationMessageType>(type), 0, 0, 0,
+                         0, 0, 0, 0});
+}
 
-    mMessageStrings.push_back(message);
-    mMessages.push_back({nullptr, nullptr, static_cast<WGPUCompilationMessageType>(type), lineNum,
+void OwnedCompilationMessages::AddMessageForTesting(std::string message,
+                                                    wgpu::CompilationMessageType type,
+                                                    uint64_t lineNum,
+                                                    uint64_t linePos,
+                                                    uint64_t offset,
+                                                    uint64_t length) {
+    AddMessage(message, {nullptr, nullptr, static_cast<WGPUCompilationMessageType>(type), lineNum,
                          linePos, offset, length, linePos, offset, length});
 }
 
 MaybeError OwnedCompilationMessages::AddMessage(const tint::diag::Diagnostic& diagnostic) {
-    // Cannot add messages after GetCompilationInfo has been called.
-    DAWN_ASSERT(mCompilationInfo.messages == nullptr);
-
     // Tint line and column values are 1-based.
     uint64_t lineNum = diagnostic.source.range.begin.line;
     uint64_t linePosInBytes = diagnostic.source.range.begin.column;
@@ -161,15 +160,27 @@
                                            fileStart + offsetInBytes, lengthInBytes)));
     }
 
-    mMessageStrings.push_back(diagnostic.message);
-
-    mMessages.push_back({nullptr, nullptr, tintSeverityToMessageType(diagnostic.severity), lineNum,
-                         linePosInBytes, offsetInBytes, lengthInBytes, linePosInUTF16,
-                         offsetInUTF16, lengthInUTF16});
+    AddMessage(
+        diagnostic.message,
+        {nullptr, nullptr, tintSeverityToMessageType(diagnostic.severity), lineNum, linePosInBytes,
+         offsetInBytes, lengthInBytes, linePosInUTF16, offsetInUTF16, lengthInUTF16});
 
     return {};
 }
 
+void OwnedCompilationMessages::AddMessage(std::string messageString,
+                                          const WGPUCompilationMessage& message) {
+    // Cannot add messages after GetCompilationInfo has been called.
+    DAWN_ASSERT(mCompilationInfo.messages == nullptr);
+
+    DAWN_ASSERT(message.nextInChain == nullptr);
+    // The message string won't be populated until GetCompilationInfo.
+    DAWN_ASSERT(message.message == nullptr);
+
+    mMessageStrings.push_back(messageString);
+    mMessages.push_back(message);
+}
+
 MaybeError OwnedCompilationMessages::AddMessages(const tint::diag::List& diagnostics) {
     // Cannot add messages after GetCompilationInfo has been called.
     DAWN_ASSERT(mCompilationInfo.messages == nullptr);
diff --git a/src/dawn/native/CompilationMessages.h b/src/dawn/native/CompilationMessages.h
index 4897cee..187d2a4 100644
--- a/src/dawn/native/CompilationMessages.h
+++ b/src/dawn/native/CompilationMessages.h
@@ -50,12 +50,19 @@
     OwnedCompilationMessages();
     ~OwnedCompilationMessages();
 
-    void AddMessage(std::string message,
-                    wgpu::CompilationMessageType type = wgpu::CompilationMessageType::Info,
-                    uint64_t lineNum = 0,
-                    uint64_t linePos = 0,
-                    uint64_t offset = 0,
-                    uint64_t length = 0);
+    // Adds a message on line 0 (before the first line).
+    void AddUnanchoredMessage(
+        std::string message,
+        wgpu::CompilationMessageType type = wgpu::CompilationMessageType::Info);
+    // For testing only. Uses the linePos/offset/length for both utf8 and utf16
+    // (which is incorrect for non-ASCII strings).
+    void AddMessageForTesting(
+        std::string message,
+        wgpu::CompilationMessageType type = wgpu::CompilationMessageType::Info,
+        uint64_t lineNum = 0,
+        uint64_t linePos = 0,
+        uint64_t offset = 0,
+        uint64_t length = 0);
     MaybeError AddMessages(const tint::diag::List& diagnostics);
     void ClearMessages();
 
@@ -64,6 +71,7 @@
 
   private:
     MaybeError AddMessage(const tint::diag::Diagnostic& diagnostic);
+    void AddMessage(std::string messageString, const WGPUCompilationMessage& message);
     void AddFormattedTintMessages(const tint::diag::List& diagnostics);
 
     WGPUCompilationInfo mCompilationInfo;
diff --git a/src/dawn/native/Device.cpp b/src/dawn/native/Device.cpp
index adf2915..4e16763 100644
--- a/src/dawn/native/Device.cpp
+++ b/src/dawn/native/Device.cpp
@@ -1241,7 +1241,7 @@
         ShaderModuleBase::MakeError(this, descriptor ? descriptor->label : nullptr);
     std::unique_ptr<OwnedCompilationMessages> compilationMessages(
         std::make_unique<OwnedCompilationMessages>());
-    compilationMessages->AddMessage(errorMessage, wgpu::CompilationMessageType::Error);
+    compilationMessages->AddUnanchoredMessage(errorMessage, wgpu::CompilationMessageType::Error);
     result->InjectCompilationMessages(std::move(compilationMessages));
 
     std::unique_ptr<ErrorData> errorData =
diff --git a/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp b/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp
index d713d92..e50b9f0 100644
--- a/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp
@@ -263,10 +263,11 @@
     native::ShaderModuleBase* shaderModuleBase = native::FromAPI(shaderModule.Get());
     native::OwnedCompilationMessages* messages = shaderModuleBase->GetCompilationMessages();
     messages->ClearMessages();
-    messages->AddMessage("Info Message");
-    messages->AddMessage("Warning Message", wgpu::CompilationMessageType::Warning);
-    messages->AddMessage("Error Message", wgpu::CompilationMessageType::Error, 3, 4);
-    messages->AddMessage("Complete Message", wgpu::CompilationMessageType::Info, 3, 4, 5, 6);
+    messages->AddMessageForTesting("Info Message");
+    messages->AddMessageForTesting("Warning Message", wgpu::CompilationMessageType::Warning);
+    messages->AddMessageForTesting("Error Message", wgpu::CompilationMessageType::Error, 3, 4);
+    messages->AddMessageForTesting("Complete Message", wgpu::CompilationMessageType::Info, 3, 4, 5,
+                                   6);
 
     auto callback = [](WGPUCompilationInfoRequestStatus status, const WGPUCompilationInfo* info,
                        void* userdata) {
