[clang] [clang] fix crash related to missing source locations for converted template arguments (PR #187352)

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 31 00:50:41 PDT 2026


================
@@ -534,16 +557,43 @@ class TemplateArgumentLoc {
 
   TemplateArgumentLoc(const TemplateArgument &Argument,
                       TemplateArgumentLocInfo Opaque)
-      : Argument(Argument), LocInfo(Opaque) {}
+      : Argument(Argument), LocInfo(Opaque) {
+    switch (Argument.getKind()) {
+    case TemplateArgument::Null:
+      assert(Opaque.isNull());
+      return;
+    case TemplateArgument::Pack:
+      assert(Opaque.isTrivial());
+      return;
+    case TemplateArgument::NullPtr:
+    case TemplateArgument::Integral:
+    case TemplateArgument::Declaration:
+    case TemplateArgument::StructuralValue:
+      assert(Opaque.isTrivial() || Opaque.getAsExpr() != nullptr);
+      return;
+    case TemplateArgument::Expression:
+      assert(Opaque.getAsExpr() != nullptr);
+      return;
+    case TemplateArgument::Type:
+      assert(Opaque.getAsTypeSourceInfo() != nullptr);
+      return;
+    case TemplateArgument::Template:
+    case TemplateArgument::TemplateExpansion:
+      assert(Opaque.getTemplate() != nullptr);
----------------
mizvekov wrote:

The status quo is that we would expect clients to use the 'getTrivial*' methods instead of using null infos like this, even if you are using a null SourceLocation.

Is that a problem for your use case?

Even using null source locations is a mess by the way, because that would be problematic if a diagnostic relied on pouting at it.

https://github.com/llvm/llvm-project/pull/187352


More information about the cfe-commits mailing list