Deleted Added
full compact
ASTDiagnostic.cpp (280031) ASTDiagnostic.cpp (283526)
1//===--- ASTDiagnostic.cpp - Diagnostic Printing Hooks for AST Nodes ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//

--- 984 unchanged lines hidden (view full) ---

993 InitializeNonTypeDiffVariables(Context, ToIter, ToDefaultNonTypeDecl,
994 HasToInt, HasToValueDecl, ToNullPtr,
995 ToExpr, ToInt, ToValueDecl);
996
997 assert(((!HasFromInt && !HasToInt) ||
998 (!HasFromValueDecl && !HasToValueDecl)) &&
999 "Template argument cannot be both integer and declaration");
1000
1//===--- ASTDiagnostic.cpp - Diagnostic Printing Hooks for AST Nodes ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//

--- 984 unchanged lines hidden (view full) ---

993 InitializeNonTypeDiffVariables(Context, ToIter, ToDefaultNonTypeDecl,
994 HasToInt, HasToValueDecl, ToNullPtr,
995 ToExpr, ToInt, ToValueDecl);
996
997 assert(((!HasFromInt && !HasToInt) ||
998 (!HasFromValueDecl && !HasToValueDecl)) &&
999 "Template argument cannot be both integer and declaration");
1000
1001 unsigned ParamWidth = 128; // Safe default
1002 if (FromDefaultNonTypeDecl->getType()->isIntegralOrEnumerationType())
1003 ParamWidth = Context.getIntWidth(FromDefaultNonTypeDecl->getType());
1004
1005 if (!HasFromInt && !HasToInt && !HasFromValueDecl && !HasToValueDecl) {
1006 Tree.SetNode(FromExpr, ToExpr);
1007 Tree.SetDefault(FromIter.isEnd() && FromExpr, ToIter.isEnd() && ToExpr);
1008 if (FromDefaultNonTypeDecl->getType()->isIntegralOrEnumerationType()) {
1009 if (FromExpr)
1001 if (!HasFromInt && !HasToInt && !HasFromValueDecl && !HasToValueDecl) {
1002 Tree.SetNode(FromExpr, ToExpr);
1003 Tree.SetDefault(FromIter.isEnd() && FromExpr, ToIter.isEnd() && ToExpr);
1004 if (FromDefaultNonTypeDecl->getType()->isIntegralOrEnumerationType()) {
1005 if (FromExpr)
1010 HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt);
1006 HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt,
1007 FromDefaultNonTypeDecl->getType());
1011 if (ToExpr)
1008 if (ToExpr)
1012 HasToInt = GetInt(Context, ToIter, ToExpr, ToInt);
1009 HasToInt = GetInt(Context, ToIter, ToExpr, ToInt,
1010 ToDefaultNonTypeDecl->getType());
1013 }
1014 if (HasFromInt && HasToInt) {
1015 Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1011 }
1012 if (HasFromInt && HasToInt) {
1013 Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1016 Tree.SetSame(IsSameConvertedInt(ParamWidth, FromInt, ToInt));
1014 Tree.SetSame(FromInt == ToInt);
1017 Tree.SetKind(DiffTree::Integer);
1018 } else if (HasFromInt || HasToInt) {
1019 Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1020 Tree.SetSame(false);
1021 Tree.SetKind(DiffTree::Integer);
1022 } else {
1015 Tree.SetKind(DiffTree::Integer);
1016 } else if (HasFromInt || HasToInt) {
1017 Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1018 Tree.SetSame(false);
1019 Tree.SetKind(DiffTree::Integer);
1020 } else {
1023 Tree.SetSame(IsEqualExpr(Context, ParamWidth, FromExpr, ToExpr) ||
1021 Tree.SetSame(IsEqualExpr(Context, FromExpr, ToExpr) ||
1024 (FromNullPtr && ToNullPtr));
1025 Tree.SetNullPtr(FromNullPtr, ToNullPtr);
1026 Tree.SetKind(DiffTree::Expression);
1027 }
1028 return;
1029 }
1030
1031 if (HasFromInt || HasToInt) {
1032 if (!HasFromInt && FromExpr)
1022 (FromNullPtr && ToNullPtr));
1023 Tree.SetNullPtr(FromNullPtr, ToNullPtr);
1024 Tree.SetKind(DiffTree::Expression);
1025 }
1026 return;
1027 }
1028
1029 if (HasFromInt || HasToInt) {
1030 if (!HasFromInt && FromExpr)
1033 HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt);
1031 HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt,
1032 FromDefaultNonTypeDecl->getType());
1034 if (!HasToInt && ToExpr)
1033 if (!HasToInt && ToExpr)
1035 HasToInt = GetInt(Context, ToIter, ToExpr, ToInt);
1034 HasToInt = GetInt(Context, ToIter, ToExpr, ToInt,
1035 ToDefaultNonTypeDecl->getType());
1036 Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1036 Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);
1037 Tree.SetSame(IsSameConvertedInt(ParamWidth, FromInt, ToInt));
1037 if (HasFromInt && HasToInt) {
1038 Tree.SetSame(FromInt == ToInt);
1039 } else {
1040 Tree.SetSame(false);
1041 }
1038 Tree.SetDefault(FromIter.isEnd() && HasFromInt,
1039 ToIter.isEnd() && HasToInt);
1040 Tree.SetKind(DiffTree::Integer);
1041 return;
1042 }
1043
1044 if (!HasFromValueDecl && FromExpr)
1045 FromValueDecl = GetValueDecl(FromIter, FromExpr);

--- 159 unchanged lines hidden (view full) ---

1205 while (SubstNonTypeTemplateParmExpr *SNTTPE =
1206 dyn_cast<SubstNonTypeTemplateParmExpr>(ArgExpr))
1207 ArgExpr = SNTTPE->getReplacement();
1208
1209 return ArgExpr;
1210 }
1211
1212 /// GetInt - Retrieves the template integer argument, including evaluating
1042 Tree.SetDefault(FromIter.isEnd() && HasFromInt,
1043 ToIter.isEnd() && HasToInt);
1044 Tree.SetKind(DiffTree::Integer);
1045 return;
1046 }
1047
1048 if (!HasFromValueDecl && FromExpr)
1049 FromValueDecl = GetValueDecl(FromIter, FromExpr);

--- 159 unchanged lines hidden (view full) ---

1209 while (SubstNonTypeTemplateParmExpr *SNTTPE =
1210 dyn_cast<SubstNonTypeTemplateParmExpr>(ArgExpr))
1211 ArgExpr = SNTTPE->getReplacement();
1212
1213 return ArgExpr;
1214 }
1215
1216 /// GetInt - Retrieves the template integer argument, including evaluating
1213 /// default arguments.
1217 /// default arguments. If the value comes from an expression, extend the
1218 /// APSInt to size of IntegerType to match the behavior in
1219 /// Sema::CheckTemplateArgument
1214 static bool GetInt(ASTContext &Context, const TSTiterator &Iter,
1220 static bool GetInt(ASTContext &Context, const TSTiterator &Iter,
1215 Expr *ArgExpr, llvm::APInt &Int) {
1221 Expr *ArgExpr, llvm::APSInt &Int, QualType IntegerType) {
1216 // Default, value-depenedent expressions require fetching
1217 // from the desugared TemplateArgument, otherwise expression needs to
1218 // be evaluatable.
1219 if (Iter.isEnd() && ArgExpr->isValueDependent()) {
1220 switch (Iter.getDesugar().getKind()) {
1221 case TemplateArgument::Integral:
1222 Int = Iter.getDesugar().getAsIntegral();
1223 return true;
1224 case TemplateArgument::Expression:
1225 ArgExpr = Iter.getDesugar().getAsExpr();
1226 Int = ArgExpr->EvaluateKnownConstInt(Context);
1222 // Default, value-depenedent expressions require fetching
1223 // from the desugared TemplateArgument, otherwise expression needs to
1224 // be evaluatable.
1225 if (Iter.isEnd() && ArgExpr->isValueDependent()) {
1226 switch (Iter.getDesugar().getKind()) {
1227 case TemplateArgument::Integral:
1228 Int = Iter.getDesugar().getAsIntegral();
1229 return true;
1230 case TemplateArgument::Expression:
1231 ArgExpr = Iter.getDesugar().getAsExpr();
1232 Int = ArgExpr->EvaluateKnownConstInt(Context);
1233 Int = Int.extOrTrunc(Context.getTypeSize(IntegerType));
1227 return true;
1228 default:
1229 llvm_unreachable("Unexpected template argument kind");
1230 }
1231 } else if (ArgExpr->isEvaluatable(Context)) {
1232 Int = ArgExpr->EvaluateKnownConstInt(Context);
1234 return true;
1235 default:
1236 llvm_unreachable("Unexpected template argument kind");
1237 }
1238 } else if (ArgExpr->isEvaluatable(Context)) {
1239 Int = ArgExpr->EvaluateKnownConstInt(Context);
1240 Int = Int.extOrTrunc(Context.getTypeSize(IntegerType));
1233 return true;
1234 }
1235
1236 return false;
1237 }
1238
1239 /// GetValueDecl - Retrieves the template Decl argument, including
1240 /// default expression argument.

--- 56 unchanged lines hidden (view full) ---

1297 if (!Iter.isEnd())
1298 return Iter->getAsTemplate().getAsTemplateDecl();
1299 if (!isVariadic)
1300 return DefaultTD;
1301
1302 return nullptr;
1303 }
1304
1241 return true;
1242 }
1243
1244 return false;
1245 }
1246
1247 /// GetValueDecl - Retrieves the template Decl argument, including
1248 /// default expression argument.

--- 56 unchanged lines hidden (view full) ---

1305 if (!Iter.isEnd())
1306 return Iter->getAsTemplate().getAsTemplateDecl();
1307 if (!isVariadic)
1308 return DefaultTD;
1309
1310 return nullptr;
1311 }
1312
1305 /// IsSameConvertedInt - Returns true if both integers are equal when
1306 /// converted to an integer type with the given width.
1307 static bool IsSameConvertedInt(unsigned Width, const llvm::APSInt &X,
1308 const llvm::APSInt &Y) {
1309 llvm::APInt ConvertedX = X.extOrTrunc(Width);
1310 llvm::APInt ConvertedY = Y.extOrTrunc(Width);
1311 return ConvertedX == ConvertedY;
1312 }
1313
1314 /// IsEqualExpr - Returns true if the expressions evaluate to the same value.
1313 /// IsEqualExpr - Returns true if the expressions evaluate to the same value.
1315 static bool IsEqualExpr(ASTContext &Context, unsigned ParamWidth,
1316 Expr *FromExpr, Expr *ToExpr) {
1314 static bool IsEqualExpr(ASTContext &Context, Expr *FromExpr, Expr *ToExpr) {
1317 if (FromExpr == ToExpr)
1318 return true;
1319
1320 if (!FromExpr || !ToExpr)
1321 return false;
1322
1323 DeclRefExpr *FromDRE = dyn_cast<DeclRefExpr>(FromExpr->IgnoreParens()),
1324 *ToDRE = dyn_cast<DeclRefExpr>(ToExpr->IgnoreParens());

--- 15 unchanged lines hidden (view full) ---

1340
1341 APValue &FromVal = FromResult.Val;
1342 APValue &ToVal = ToResult.Val;
1343
1344 if (FromVal.getKind() != ToVal.getKind()) return false;
1345
1346 switch (FromVal.getKind()) {
1347 case APValue::Int:
1315 if (FromExpr == ToExpr)
1316 return true;
1317
1318 if (!FromExpr || !ToExpr)
1319 return false;
1320
1321 DeclRefExpr *FromDRE = dyn_cast<DeclRefExpr>(FromExpr->IgnoreParens()),
1322 *ToDRE = dyn_cast<DeclRefExpr>(ToExpr->IgnoreParens());

--- 15 unchanged lines hidden (view full) ---

1338
1339 APValue &FromVal = FromResult.Val;
1340 APValue &ToVal = ToResult.Val;
1341
1342 if (FromVal.getKind() != ToVal.getKind()) return false;
1343
1344 switch (FromVal.getKind()) {
1345 case APValue::Int:
1348 return IsSameConvertedInt(ParamWidth, FromVal.getInt(), ToVal.getInt());
1346 return FromVal.getInt() == ToVal.getInt();
1349 case APValue::LValue: {
1350 APValue::LValueBase FromBase = FromVal.getLValueBase();
1351 APValue::LValueBase ToBase = ToVal.getLValueBase();
1352 if (FromBase.isNull() && ToBase.isNull())
1353 return true;
1354 if (FromBase.isNull() || ToBase.isNull())
1355 return false;
1356 return FromBase.get<const ValueDecl*>() ==

--- 293 unchanged lines hidden (view full) ---

1650 OS << Val.toString(10);
1651 } else if (E) {
1652 PrintExpr(E);
1653 } else {
1654 OS << "(no argument)";
1655 }
1656 Unbold();
1657 }
1347 case APValue::LValue: {
1348 APValue::LValueBase FromBase = FromVal.getLValueBase();
1349 APValue::LValueBase ToBase = ToVal.getLValueBase();
1350 if (FromBase.isNull() && ToBase.isNull())
1351 return true;
1352 if (FromBase.isNull() || ToBase.isNull())
1353 return false;
1354 return FromBase.get<const ValueDecl*>() ==

--- 293 unchanged lines hidden (view full) ---

1648 OS << Val.toString(10);
1649 } else if (E) {
1650 PrintExpr(E);
1651 } else {
1652 OS << "(no argument)";
1653 }
1654 Unbold();
1655 }
1658
1656
1659 /// HasExtraInfo - Returns true if E is not an integer literal or the
1660 /// negation of an integer literal
1661 bool HasExtraInfo(Expr *E) {
1662 if (!E) return false;
1657 /// HasExtraInfo - Returns true if E is not an integer literal or the
1658 /// negation of an integer literal
1659 bool HasExtraInfo(Expr *E) {
1660 if (!E) return false;
1661
1662 E = E->IgnoreImpCasts();
1663
1663 if (isa<IntegerLiteral>(E)) return false;
1664
1665 if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
1666 if (UO->getOpcode() == UO_Minus)
1667 if (isa<IntegerLiteral>(UO->getSubExpr()))
1668 return false;
1669
1670 return true;

--- 202 unchanged lines hidden ---
1664 if (isa<IntegerLiteral>(E)) return false;
1665
1666 if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
1667 if (UO->getOpcode() == UO_Minus)
1668 if (isa<IntegerLiteral>(UO->getSubExpr()))
1669 return false;
1670
1671 return true;

--- 202 unchanged lines hidden ---